{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "water_pred_prophet.ipynb",
      "provenance": [],
      "machine_shape": "hm",
      "mount_file_id": "https://github.com/bingblackbean/water_network_pressure_pred/blob/main/water_pred_deepar.ipynb",
      "authorship_tag": "ABX9TyPIV8S/VDvEyx7g+i9e2v0i",
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/bingblackbean/water_supply_network_pressure_pred_deepar/blob/main/water_pred_deepar.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "tsv-C_5HoL6C",
        "outputId": "b524d9c3-7d8c-429e-efff-43793b18aa1e"
      },
      "source": [
        "!pip install gluonts\r\n",
        "!pip install mxnet\r\n",
        "#!pip install -U mxnet-cu101==1.7.0 #### install GPU version if you have"
      ],
      "execution_count": 31,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Requirement already satisfied: gluonts in /usr/local/lib/python3.6/dist-packages (0.6.5)\n",
            "Requirement already satisfied: ujson~=1.35 in /usr/local/lib/python3.6/dist-packages (from gluonts) (1.35)\n",
            "Requirement already satisfied: pandas>=1.0 in /usr/local/lib/python3.6/dist-packages (from gluonts) (1.1.5)\n",
            "Requirement already satisfied: matplotlib~=3.0 in /usr/local/lib/python3.6/dist-packages (from gluonts) (3.2.2)\n",
            "Requirement already satisfied: toolz~=0.10 in /usr/local/lib/python3.6/dist-packages (from gluonts) (0.11.1)\n",
            "Requirement already satisfied: holidays>=0.9 in /usr/local/lib/python3.6/dist-packages (from gluonts) (0.10.4)\n",
            "Requirement already satisfied: pydantic<1.7,~=1.1 in /usr/local/lib/python3.6/dist-packages (from gluonts) (1.6.1)\n",
            "Requirement already satisfied: numpy~=1.16 in /usr/local/lib/python3.6/dist-packages (from gluonts) (1.19.5)\n",
            "Requirement already satisfied: tqdm~=4.23 in /usr/local/lib/python3.6/dist-packages (from gluonts) (4.41.1)\n",
            "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.6/dist-packages (from pandas>=1.0->gluonts) (2.8.1)\n",
            "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=1.0->gluonts) (2018.9)\n",
            "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->gluonts) (2.4.7)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->gluonts) (0.10.0)\n",
            "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib~=3.0->gluonts) (1.3.1)\n",
            "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from holidays>=0.9->gluonts) (1.15.0)\n",
            "Requirement already satisfied: korean-lunar-calendar in /usr/local/lib/python3.6/dist-packages (from holidays>=0.9->gluonts) (0.2.1)\n",
            "Requirement already satisfied: convertdate<=2.2.0 in /usr/local/lib/python3.6/dist-packages (from holidays>=0.9->gluonts) (2.2.0)\n",
            "Requirement already satisfied: dataclasses>=0.6; python_version < \"3.7\" in /usr/local/lib/python3.6/dist-packages (from pydantic<1.7,~=1.1->gluonts) (0.8)\n",
            "Requirement already satisfied: pymeeus<=1,>=0.3.6 in /usr/local/lib/python3.6/dist-packages (from convertdate<=2.2.0->holidays>=0.9->gluonts) (0.3.7)\n",
            "Requirement already satisfied: mxnet in /usr/local/lib/python3.6/dist-packages (1.7.0.post1)\n",
            "Requirement already satisfied: graphviz<0.9.0,>=0.8.1 in /usr/local/lib/python3.6/dist-packages (from mxnet) (0.8.4)\n",
            "Requirement already satisfied: requests<3,>=2.20.0 in /usr/local/lib/python3.6/dist-packages (from mxnet) (2.23.0)\n",
            "Requirement already satisfied: numpy<2.0.0,>1.16.0 in /usr/local/lib/python3.6/dist-packages (from mxnet) (1.19.5)\n",
            "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.20.0->mxnet) (1.24.3)\n",
            "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.20.0->mxnet) (3.0.4)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.20.0->mxnet) (2020.12.5)\n",
            "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests<3,>=2.20.0->mxnet) (2.10)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "vDr4u2COjzVm",
        "outputId": "587b19ec-3737-41a3-896b-dc02665e7489"
      },
      "source": [
        "import pandas as pd\r\n",
        "import numpy as np\r\n",
        "from google.colab import drive\r\n",
        "from tqdm import tqdm,tqdm_notebook\r\n",
        "import matplotlib.pyplot as plt\r\n",
        "from sklearn.metrics import mean_squared_error\r\n",
        "from sklearn.model_selection import TimeSeriesSplit\r\n",
        "from gluonts.model.deepar import DeepAREstimator\r\n",
        "from gluonts.trainer import Trainer\r\n",
        "from gluonts.dataset.common import ListDataset\r\n",
        "from gluonts.model import deepar\r\n",
        "from gluonts.dataset.field_names import FieldName\r\n",
        "import mxnet as mx\r\n",
        "import random\r\n",
        "from gluonts.evaluation.backtest import make_evaluation_predictions\r\n",
        "from gluonts.evaluation import Evaluator\r\n",
        "import json\r\n",
        "\r\n",
        "r_seed = 20\r\n",
        "random.seed(r_seed)\r\n",
        "mx.random.seed(r_seed)\r\n",
        "np.random.seed(r_seed)\r\n",
        "\r\n",
        "import gc\r\n",
        "import warnings\r\n",
        "warnings.filterwarnings(\"ignore\")\r\n",
        "drive.mount(\"/content/gdrive\")"
      ],
      "execution_count": 32,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Drive already mounted at /content/gdrive; to attempt to forcibly remount, call drive.mount(\"/content/gdrive\", force_remount=True).\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "75vi8PpXqwER"
      },
      "source": [
        "G_THRESHOLD = 3.5  # used to remove outliers\r\n",
        "G_POST_LIST= [i+1 for i in range(30)] # measurement station lists"
      ],
      "execution_count": 33,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "qL4qtdX2qxAA"
      },
      "source": [
        "folder = '/content/gdrive/MyDrive/water_pred/' \r\n",
        "pressure_2018_df  = pd.read_csv(folder+'train_水压数据_2018.csv',encoding='utf8')\r\n",
        "pressure_2019_df  = pd.read_csv(folder+'train_水压数据_2019.csv',encoding='utf8')\r\n",
        "pressure_2020_df  = pd.read_csv(folder+'test_水压数据_2020.csv',encoding='utf8')\r\n",
        "weather_2018_2019_df = pd.read_csv(folder+'2018-2019气象数据.csv',encoding='utf8')  # not used in this baseline\r\n",
        "weather_2020_df = pd.read_csv(folder+'2020气象数据.csv',encoding='utf8')  # not used in this baseline\r\n",
        "pressure_2018_2019_df = pd.concat([pressure_2018_df,pressure_2019_df],ignore_index=True)\r\n",
        "\r\n",
        "to_predict_df_1st = pd.read_csv(folder+'to_predict.csv',encoding='utf8')"
      ],
      "execution_count": 34,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "RzlOe4iJCXUB",
        "outputId": "ce017230-f1c5-4431-9c0b-f657769d529f",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 309
        }
      },
      "source": [
        "pressure_2018_2019_df.head()"
      ],
      "execution_count": 35,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Time</th>\n",
              "      <th>MeasName</th>\n",
              "      <th>H0</th>\n",
              "      <th>H1</th>\n",
              "      <th>H2</th>\n",
              "      <th>H3</th>\n",
              "      <th>H4</th>\n",
              "      <th>H5</th>\n",
              "      <th>H6</th>\n",
              "      <th>H7</th>\n",
              "      <th>H8</th>\n",
              "      <th>H9</th>\n",
              "      <th>H10</th>\n",
              "      <th>H11</th>\n",
              "      <th>H12</th>\n",
              "      <th>H13</th>\n",
              "      <th>H14</th>\n",
              "      <th>H15</th>\n",
              "      <th>H16</th>\n",
              "      <th>H17</th>\n",
              "      <th>H18</th>\n",
              "      <th>H19</th>\n",
              "      <th>H20</th>\n",
              "      <th>H21</th>\n",
              "      <th>H22</th>\n",
              "      <th>H23</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>2018-01-01</td>\n",
              "      <td>站点4</td>\n",
              "      <td>0.402750</td>\n",
              "      <td>0.407625</td>\n",
              "      <td>0.418125</td>\n",
              "      <td>0.425250</td>\n",
              "      <td>0.426000</td>\n",
              "      <td>0.425250</td>\n",
              "      <td>0.417375</td>\n",
              "      <td>0.426375</td>\n",
              "      <td>0.376500</td>\n",
              "      <td>0.334125</td>\n",
              "      <td>0.331500</td>\n",
              "      <td>0.340500</td>\n",
              "      <td>0.349500</td>\n",
              "      <td>0.358875</td>\n",
              "      <td>0.348750</td>\n",
              "      <td>0.359250</td>\n",
              "      <td>0.355500</td>\n",
              "      <td>0.344250</td>\n",
              "      <td>0.352125</td>\n",
              "      <td>0.356250</td>\n",
              "      <td>0.347250</td>\n",
              "      <td>0.343875</td>\n",
              "      <td>0.356625</td>\n",
              "      <td>0.418875</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>2018-01-01</td>\n",
              "      <td>站点7</td>\n",
              "      <td>0.214375</td>\n",
              "      <td>0.226750</td>\n",
              "      <td>0.232375</td>\n",
              "      <td>0.233125</td>\n",
              "      <td>0.235000</td>\n",
              "      <td>0.232750</td>\n",
              "      <td>0.230875</td>\n",
              "      <td>0.220000</td>\n",
              "      <td>0.193750</td>\n",
              "      <td>0.160375</td>\n",
              "      <td>0.144250</td>\n",
              "      <td>0.147625</td>\n",
              "      <td>0.161875</td>\n",
              "      <td>0.178750</td>\n",
              "      <td>0.187375</td>\n",
              "      <td>0.196750</td>\n",
              "      <td>0.199750</td>\n",
              "      <td>0.192250</td>\n",
              "      <td>0.186250</td>\n",
              "      <td>0.183250</td>\n",
              "      <td>0.177250</td>\n",
              "      <td>0.163375</td>\n",
              "      <td>0.165250</td>\n",
              "      <td>0.199375</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>2018-01-01</td>\n",
              "      <td>站点22</td>\n",
              "      <td>0.247000</td>\n",
              "      <td>0.248125</td>\n",
              "      <td>0.271375</td>\n",
              "      <td>0.251125</td>\n",
              "      <td>0.272125</td>\n",
              "      <td>0.256375</td>\n",
              "      <td>0.257125</td>\n",
              "      <td>0.242500</td>\n",
              "      <td>0.233500</td>\n",
              "      <td>0.231625</td>\n",
              "      <td>0.233125</td>\n",
              "      <td>0.233875</td>\n",
              "      <td>0.229000</td>\n",
              "      <td>0.239500</td>\n",
              "      <td>0.245500</td>\n",
              "      <td>0.242875</td>\n",
              "      <td>0.238375</td>\n",
              "      <td>0.230875</td>\n",
              "      <td>0.237250</td>\n",
              "      <td>0.236875</td>\n",
              "      <td>0.236500</td>\n",
              "      <td>0.236500</td>\n",
              "      <td>0.241000</td>\n",
              "      <td>0.254500</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>2018-01-01</td>\n",
              "      <td>站点21</td>\n",
              "      <td>0.284250</td>\n",
              "      <td>0.289875</td>\n",
              "      <td>0.283500</td>\n",
              "      <td>0.281250</td>\n",
              "      <td>0.288375</td>\n",
              "      <td>0.288750</td>\n",
              "      <td>0.285750</td>\n",
              "      <td>0.255750</td>\n",
              "      <td>0.198375</td>\n",
              "      <td>0.165375</td>\n",
              "      <td>0.159000</td>\n",
              "      <td>0.187500</td>\n",
              "      <td>0.223125</td>\n",
              "      <td>0.211500</td>\n",
              "      <td>0.227625</td>\n",
              "      <td>0.238125</td>\n",
              "      <td>0.238500</td>\n",
              "      <td>0.218625</td>\n",
              "      <td>0.207000</td>\n",
              "      <td>0.212625</td>\n",
              "      <td>0.209250</td>\n",
              "      <td>0.189000</td>\n",
              "      <td>0.217875</td>\n",
              "      <td>0.270000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>2018-01-01</td>\n",
              "      <td>站点20</td>\n",
              "      <td>0.292875</td>\n",
              "      <td>0.295875</td>\n",
              "      <td>0.305250</td>\n",
              "      <td>0.298875</td>\n",
              "      <td>0.310125</td>\n",
              "      <td>0.300750</td>\n",
              "      <td>0.288375</td>\n",
              "      <td>0.262500</td>\n",
              "      <td>0.216375</td>\n",
              "      <td>0.190875</td>\n",
              "      <td>0.175500</td>\n",
              "      <td>0.206250</td>\n",
              "      <td>0.229875</td>\n",
              "      <td>0.233625</td>\n",
              "      <td>0.247500</td>\n",
              "      <td>0.241125</td>\n",
              "      <td>0.243375</td>\n",
              "      <td>0.232500</td>\n",
              "      <td>0.233625</td>\n",
              "      <td>0.224250</td>\n",
              "      <td>0.219375</td>\n",
              "      <td>0.202125</td>\n",
              "      <td>0.219375</td>\n",
              "      <td>0.286500</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "         Time MeasName        H0  ...       H21       H22       H23\n",
              "0  2018-01-01      站点4  0.402750  ...  0.343875  0.356625  0.418875\n",
              "1  2018-01-01      站点7  0.214375  ...  0.163375  0.165250  0.199375\n",
              "2  2018-01-01     站点22  0.247000  ...  0.236500  0.241000  0.254500\n",
              "3  2018-01-01     站点21  0.284250  ...  0.189000  0.217875  0.270000\n",
              "4  2018-01-01     站点20  0.292875  ...  0.202125  0.219375  0.286500\n",
              "\n",
              "[5 rows x 26 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 35
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QFHlRkiJDWq0",
        "outputId": "f02ebc06-a23e-42c0-e34f-a35deb2edf6c",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        }
      },
      "source": [
        "to_predict_df_1st.head()"
      ],
      "execution_count": 36,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>id</th>\n",
              "      <th>Time</th>\n",
              "      <th>MeasName</th>\n",
              "      <th>Hour</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0</td>\n",
              "      <td>2020-02-03</td>\n",
              "      <td>站点4</td>\n",
              "      <td>H0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>1</td>\n",
              "      <td>2020-02-03</td>\n",
              "      <td>站点4</td>\n",
              "      <td>H1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>2</td>\n",
              "      <td>2020-02-03</td>\n",
              "      <td>站点4</td>\n",
              "      <td>H2</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>3</td>\n",
              "      <td>2020-02-03</td>\n",
              "      <td>站点4</td>\n",
              "      <td>H3</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>4</td>\n",
              "      <td>2020-02-03</td>\n",
              "      <td>站点4</td>\n",
              "      <td>H4</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "   id        Time MeasName Hour\n",
              "0   0  2020-02-03      站点4   H0\n",
              "1   1  2020-02-03      站点4   H1\n",
              "2   2  2020-02-03      站点4   H2\n",
              "3   3  2020-02-03      站点4   H3\n",
              "4   4  2020-02-03      站点4   H4"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 36
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "kdI97_mAq0tU",
        "outputId": "f21b966e-c46e-4432-9a0f-1bedacb02a1c"
      },
      "source": [
        "def format_df(df):\r\n",
        "    df['MeasName'] = pd.to_numeric(df['MeasName'].str.lstrip('站点'))\r\n",
        "    df['Time'] =pd.to_datetime(df['Time'])\r\n",
        "    return df\r\n",
        "\r\n",
        "def reshape_pressure_df(df):\r\n",
        "    # reshape to column-wise\r\n",
        "    df_reshape = pd.DataFrame(None,columns=['DateTime','MeasName','Pressure'])\r\n",
        "    for i in [i for i in range(24)]:\r\n",
        "        per_hour_df = df[['Time','MeasName',f'H{i}']]\r\n",
        "        per_hour_df['Time'] = per_hour_df['Time']+ pd.Timedelta(i,unit='h')\r\n",
        "        per_hour_df.columns=['DateTime','MeasName','Pressure']   \r\n",
        "        df_reshape = pd.concat([df_reshape,per_hour_df])\r\n",
        "    df_reshape = pd.pivot_table(df_reshape, values='Pressure', index=['DateTime'],\r\n",
        "                    columns=['MeasName'])\r\n",
        "    return df_reshape\r\n",
        "\r\n",
        "def dt_features(df):\r\n",
        "    df['hour'] = df.index.hour\r\n",
        "    df['day'] = df.index.day\r\n",
        "    df['weekday'] = df.index.dayofweek\r\n",
        "    df['weeks'] = df.index.weekofyear\r\n",
        "    df['month'] = df.index.month   \r\n",
        "    df['quarter'] = df.index.quarter\r\n",
        "    return df\r\n",
        "\r\n",
        "def remove_abnormal(df):\r\n",
        "    df[df[G_POST_LIST]<=0.1] =None\r\n",
        "    df[df[G_POST_LIST]>=0.5] =None\r\n",
        "    return df\r\n",
        "\r\n",
        "def remove_abnormal_z_score(df,by_col='hour',th =3 ):\r\n",
        "    for pos in tqdm(G_POST_LIST):\r\n",
        "        df_zscore=df[[pos,by_col]].copy()\r\n",
        "        f_zscores_all = pd.Series()\r\n",
        "        for i in range(24):\r\n",
        "            f_zscores=(df_zscore[df_zscore[by_col]==i][pos]-df_zscore[df_zscore[by_col]==i][pos].mean())/df_zscore[df_zscore[by_col]==i][pos].std()\r\n",
        "            f_zscores_all= pd.concat([f_zscores_all,f_zscores])\r\n",
        "        f_zscores_all.sort_index(inplace=True)\r\n",
        "        df_zscore.loc[f_zscores_all.abs()> th,pos] = None # must use loc\r\n",
        "        df[pos] = df_zscore[pos]\r\n",
        "    return df\r\n",
        "\r\n",
        "def remove_abnormal_zero_var(df,window =3,th=1e-07):\r\n",
        "    for pos in tqdm(G_POST_LIST):\r\n",
        "        df_pos=df[[pos]].copy()\r\n",
        "        df_pos['var']=df_pos[pos].rolling(window=window,center=False).std()\r\n",
        "        df_pos.loc[df_pos['var'] <= th,pos] = None # must use loc\r\n",
        "        df[pos] = df_pos[pos]\r\n",
        "    return df\r\n",
        "def dt_features_for_submit(df): \r\n",
        "    df['hour'] = pd.to_numeric(df['Hour'].str.lstrip('H'))\r\n",
        "    df['DateTime'] = df['Time']+ pd.to_timedelta(df['hour'], unit='h')\r\n",
        "    df.drop('Hour',axis=1,inplace=True)\r\n",
        "    df['day'] = df['Time'].dt.day\r\n",
        "    df['weekday'] = df['Time'].dt.dayofweek\r\n",
        "    df['weeks'] = df['Time'].dt.weekofyear\r\n",
        "    df['month'] = df['Time'].dt.month   \r\n",
        "    df['quarter'] = df['Time'].dt.quarter\r\n",
        "    return df\r\n",
        "def preproc_df(df):\r\n",
        "    df = format_df(df)\r\n",
        "    df = reshape_pressure_df(df)\r\n",
        "    df = remove_abnormal(df)\r\n",
        "    df =dt_features(df)\r\n",
        "    df = remove_abnormal_z_score(df,th =G_THRESHOLD)\r\n",
        "    df = remove_abnormal_zero_var(df,window =3,th=1e-07)\r\n",
        "    return df\r\n",
        "\r\n",
        "def preproc_submit_df(df):\r\n",
        "    df = format_df(df)\r\n",
        "    df = dt_features_for_submit(df)\r\n",
        "    return df\r\n",
        "pressure_2018_2019_df = preproc_df(pressure_2018_2019_df)\r\n",
        "pressure_2020_df = preproc_df(pressure_2020_df)\r\n",
        "to_predict_df_1st = preproc_submit_df(to_predict_df_1st)\r\n",
        "print(pressure_2018_2019_df.shape)\r\n",
        "print(pressure_2020_df.shape)\r\n",
        "print(to_predict_df_1st.shape)"
      ],
      "execution_count": 37,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "100%|██████████| 30/30 [00:02<00:00, 12.01it/s]\n",
            "100%|██████████| 30/30 [00:00<00:00, 271.01it/s]\n",
            "100%|██████████| 30/30 [00:02<00:00, 14.66it/s]\n",
            "100%|██████████| 30/30 [00:00<00:00, 364.11it/s]"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "(17520, 36)\n",
            "(2976, 36)\n",
            "(40320, 10)\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "RzVTsZWtrCH4",
        "outputId": "47857beb-a486-48bb-b5a8-36da1a97223e"
      },
      "source": [
        "print(pressure_2018_2019_df.head())\r\n",
        "print(pressure_2020_df.head())"
      ],
      "execution_count": 38,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "MeasName                    1        2         3  ...  weeks  month  quarter\n",
            "DateTime                                          ...                       \n",
            "2018-01-01 00:00:00  0.288625  0.31775  0.301375  ...      1      1        1\n",
            "2018-01-01 01:00:00  0.292000  0.31925  0.303250  ...      1      1        1\n",
            "2018-01-01 02:00:00  0.290500  0.32000  0.302125  ...      1      1        1\n",
            "2018-01-01 03:00:00  0.299500  0.32150  0.303250  ...      1      1        1\n",
            "2018-01-01 04:00:00  0.300250  0.32675  0.307000  ...      1      1        1\n",
            "\n",
            "[5 rows x 36 columns]\n",
            "MeasName                    1         2         3  ...  weeks  month  quarter\n",
            "DateTime                                           ...                       \n",
            "2020-01-01 00:00:00  0.309625  0.343250  0.324125  ...      1      1        1\n",
            "2020-01-01 01:00:00  0.325750  0.359375  0.341000  ...      1      1        1\n",
            "2020-01-01 02:00:00  0.332875  0.362750  0.348125  ...      1      1        1\n",
            "2020-01-01 03:00:00  0.324250  0.355625  0.338750  ...      1      1        1\n",
            "2020-01-01 04:00:00  0.331750  0.361625  0.346250  ...      1      1        1\n",
            "\n",
            "[5 rows x 36 columns]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "FKAxKAjEWat_",
        "outputId": "8fb8549b-b12d-4c86-fc2e-fa14d8cc79d4"
      },
      "source": [
        "def fill_gap_by_previous_window(df,windows=7*24): # if happenly last previous period has smilar missing gap, it is hard to fill (so try run this funtion multiple times)\r\n",
        "    for pos in G_POST_LIST:\r\n",
        "        last_score = 0\r\n",
        "        while df.iloc[windows:,:][pos].isna().sum() !=0: # don;t need to check first window (we cannot fill this period)\r\n",
        "            if last_score == df.iloc[windows:,:][pos].isna().sum():\r\n",
        "                break\r\n",
        "            else:\r\n",
        "                pf_df = df[[pos]]\r\n",
        "                pf_df['yhat'] = pf_df[pos].shift(windows)\r\n",
        "                pf_df[pos].fillna(pf_df['yhat'],inplace=True)\r\n",
        "                df[pos] = pf_df[pos]\r\n",
        "            last_score = df.iloc[windows:,:][pos].isna().sum()\r\n",
        "    return df\r\n",
        "for i in tqdm(range(100)):\r\n",
        "    pressure_2018_2019_df = fill_gap_by_previous_window(pressure_2018_2019_df,windows=7*24)\r\n",
        "    pressure_2020_df = fill_gap_by_previous_window(pressure_2020_df,windows=7*24)"
      ],
      "execution_count": 39,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "100%|██████████| 100/100 [00:04<00:00, 21.11it/s]\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ULfS8QEOFuH7",
        "outputId": "66522fdb-3c89-479a-98ad-c5504410b6ce",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "source": [
        "pressure_2018_2019_df.info()\r\n",
        "pressure_2020_df.info()"
      ],
      "execution_count": 40,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "<class 'pandas.core.frame.DataFrame'>\n",
            "DatetimeIndex: 17520 entries, 2018-01-01 00:00:00 to 2019-12-31 23:00:00\n",
            "Data columns (total 36 columns):\n",
            " #   Column   Non-Null Count  Dtype  \n",
            "---  ------   --------------  -----  \n",
            " 0   1        17520 non-null  float64\n",
            " 1   2        17519 non-null  float64\n",
            " 2   3        17520 non-null  float64\n",
            " 3   4        17520 non-null  float64\n",
            " 4   5        17520 non-null  float64\n",
            " 5   6        17520 non-null  float64\n",
            " 6   7        17520 non-null  float64\n",
            " 7   8        17520 non-null  float64\n",
            " 8   9        17520 non-null  float64\n",
            " 9   10       17520 non-null  float64\n",
            " 10  11       17520 non-null  float64\n",
            " 11  12       17520 non-null  float64\n",
            " 12  13       17520 non-null  float64\n",
            " 13  14       17520 non-null  float64\n",
            " 14  15       17517 non-null  float64\n",
            " 15  16       17520 non-null  float64\n",
            " 16  17       14376 non-null  float64\n",
            " 17  18       17513 non-null  float64\n",
            " 18  19       17520 non-null  float64\n",
            " 19  20       17520 non-null  float64\n",
            " 20  21       17520 non-null  float64\n",
            " 21  22       17520 non-null  float64\n",
            " 22  23       17520 non-null  float64\n",
            " 23  24       17520 non-null  float64\n",
            " 24  25       17474 non-null  float64\n",
            " 25  26       17520 non-null  float64\n",
            " 26  27       17520 non-null  float64\n",
            " 27  28       17520 non-null  float64\n",
            " 28  29       17520 non-null  float64\n",
            " 29  30       17520 non-null  float64\n",
            " 30  hour     17520 non-null  int64  \n",
            " 31  day      17520 non-null  int64  \n",
            " 32  weekday  17520 non-null  int64  \n",
            " 33  weeks    17520 non-null  int64  \n",
            " 34  month    17520 non-null  int64  \n",
            " 35  quarter  17520 non-null  int64  \n",
            "dtypes: float64(30), int64(6)\n",
            "memory usage: 4.9 MB\n",
            "<class 'pandas.core.frame.DataFrame'>\n",
            "DatetimeIndex: 2976 entries, 2020-01-01 00:00:00 to 2020-08-31 23:00:00\n",
            "Data columns (total 36 columns):\n",
            " #   Column   Non-Null Count  Dtype  \n",
            "---  ------   --------------  -----  \n",
            " 0   1        2976 non-null   float64\n",
            " 1   2        2976 non-null   float64\n",
            " 2   3        2976 non-null   float64\n",
            " 3   4        2976 non-null   float64\n",
            " 4   5        2976 non-null   float64\n",
            " 5   6        2976 non-null   float64\n",
            " 6   7        2976 non-null   float64\n",
            " 7   8        2976 non-null   float64\n",
            " 8   9        2976 non-null   float64\n",
            " 9   10       2976 non-null   float64\n",
            " 10  11       2976 non-null   float64\n",
            " 11  12       2976 non-null   float64\n",
            " 12  13       2975 non-null   float64\n",
            " 13  14       2976 non-null   float64\n",
            " 14  15       2971 non-null   float64\n",
            " 15  16       2976 non-null   float64\n",
            " 16  17       2920 non-null   float64\n",
            " 17  18       2962 non-null   float64\n",
            " 18  19       2976 non-null   float64\n",
            " 19  20       2976 non-null   float64\n",
            " 20  21       2970 non-null   float64\n",
            " 21  22       2974 non-null   float64\n",
            " 22  23       2976 non-null   float64\n",
            " 23  24       2976 non-null   float64\n",
            " 24  25       2976 non-null   float64\n",
            " 25  26       2928 non-null   float64\n",
            " 26  27       2976 non-null   float64\n",
            " 27  28       2976 non-null   float64\n",
            " 28  29       2976 non-null   float64\n",
            " 29  30       2976 non-null   float64\n",
            " 30  hour     2976 non-null   int64  \n",
            " 31  day      2976 non-null   int64  \n",
            " 32  weekday  2976 non-null   int64  \n",
            " 33  weeks    2976 non-null   int64  \n",
            " 34  month    2976 non-null   int64  \n",
            " 35  quarter  2976 non-null   int64  \n",
            "dtypes: float64(30), int64(6)\n",
            "memory usage: 860.2 KB\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xwgS_jLQOchZ"
      },
      "source": [
        "def diff_pos(df,pos_list,periods=1):\r\n",
        "    diff_df = df.copy()\r\n",
        "    for c in df.columns:\r\n",
        "        if c in pos_list:\r\n",
        "            diff_df[c] = df[c].diff(periods=periods)\r\n",
        "        else:\r\n",
        "            diff_df[c] = df[c]\r\n",
        "    return diff_df"
      ],
      "execution_count": 41,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ZMtIEV77Osu6"
      },
      "source": [
        "diff_periods = 21*24\r\n",
        "pressure_2020_df_diff = diff_pos(pressure_2020_df,G_POST_LIST,diff_periods)\r\n",
        "pressure_2018_2019_df_diff = diff_pos(pressure_2018_2019_df,G_POST_LIST,diff_periods)"
      ],
      "execution_count": 42,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "bO0Wre-QW7vg",
        "outputId": "6cbf17c9-8740-4568-d874-08ba7aa86aef"
      },
      "source": [
        "# final model\r\n",
        "freq = \"1H\"\r\n",
        "prediction_length = 21*24\r\n",
        "context_length = 28*24\r\n",
        "print(f'seed is {r_seed}')\r\n",
        "mx.random.seed(r_seed)\r\n",
        "np.random.seed(r_seed)\r\n",
        "\r\n",
        "use_diff_2018_2019_df = pressure_2018_2019_df_diff\r\n",
        "\r\n",
        "pos_group_dict = {1:6,2:0,3:6,4:0,5:6,6:4,7:6,8:0,9:4,10:4,11:5,12:6,13:6,14:2,15:1,16:3,17:7,18:6,19:6,20:6,21:6,22:5,23:4,24:4,25:6,26:5,27:5,28:6,29:6,30:5}\r\n",
        "meas_dict = {pos:pos for pos in G_POST_LIST}\r\n",
        "train_ds = ListDataset([{'target': use_diff_2018_2019_df.loc['2018-06':'2019-10',pos], 'start': pd.Timestamp(\"2018-06-01\", freq=freq),FieldName.FEAT_STATIC_CAT:[pos_group_dict[pos],meas_dict[pos]]} for pos in G_POST_LIST]\r\n",
        "                        ,\r\n",
        "                    freq=freq)\r\n",
        "validate_ds = ListDataset([{'target': use_diff_2018_2019_df.loc['2019-11':'2019-12',pos], 'start': pd.Timestamp(\"2019-11-01\", freq=freq),FieldName.FEAT_STATIC_CAT:[pos_group_dict[pos],meas_dict[pos]]} for pos in G_POST_LIST]\r\n",
        "                        ,\r\n",
        "                    freq=freq)\r\n",
        "trainer = Trainer(epochs=3,batch_size=128,num_batches_per_epoch=50,patience=5)\r\n",
        "estimator = deepar.DeepAREstimator(\r\n",
        "    freq=freq, prediction_length=prediction_length, trainer=trainer,context_length=context_length,use_feat_dynamic_real =False,num_layers=2,num_cells=40,use_feat_static_cat  =True,cardinality=[30,30],embedding_dimension =[11,50],lags_seq= [24,12,8])\r\n",
        "predictor = estimator.train(training_data=train_ds)#,validation_data=validate_ds)\r\n"
      ],
      "execution_count": 43,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "\r  0%|          | 0/50 [00:00<?, ?it/s]"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "seed is 20\n",
            "learning rate from ``lr_scheduler`` has been overwritten by ``learning_rate`` in optimizer.\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "100%|██████████| 50/50 [03:21<00:00,  4.03s/it, epoch=1/3, avg_epoch_loss=-2.65]\n",
            "100%|██████████| 50/50 [02:41<00:00,  3.23s/it, epoch=2/3, avg_epoch_loss=-2.73]\n",
            "100%|██████████| 50/50 [02:36<00:00,  3.14s/it, epoch=3/3, avg_epoch_loss=-2.76]\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ZQkEUROECrnH",
        "outputId": "a46ebbc9-5615-4546-e739-b11fc45a8607"
      },
      "source": [
        "\r\n",
        "forecast_it, ts_it = make_evaluation_predictions(\r\n",
        "    dataset=validate_ds,  # test dataset\r\n",
        "    predictor=predictor,  # predictor\r\n",
        "    num_samples=prediction_length, \r\n",
        ")\r\n",
        "\r\n",
        "forecasts = list(forecast_it)\r\n",
        "tss = list(ts_it)\r\n",
        "\r\n",
        "evaluator = Evaluator(quantiles=[0.1, 0.5, 0.9])\r\n",
        "agg_metrics, item_metrics = evaluator(iter(tss), iter(forecasts), num_series=30)\r\n",
        "print(json.dumps(agg_metrics, indent=4))"
      ],
      "execution_count": 44,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Running evaluation: 100%|██████████| 30/30 [00:00<00:00, 332.39it/s]\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "{\n",
            "    \"MSE\": 0.0005933114690903238,\n",
            "    \"abs_error\": 237.4205093383789,\n",
            "    \"abs_target_sum\": 231.29268169403076,\n",
            "    \"abs_target_mean\": 0.015297135032673992,\n",
            "    \"seasonal_error\": 0.015220939501737935,\n",
            "    \"MASE\": 0.9690541368423291,\n",
            "    \"MAPE\": 1.555092823242546,\n",
            "    \"sMAPE\": 1.475908665372541,\n",
            "    \"OWA\": NaN,\n",
            "    \"MSIS\": 8.12769844485678,\n",
            "    \"QuantileLoss[0.1]\": 118.81208705175668,\n",
            "    \"Coverage[0.1]\": 0.06666666666666662,\n",
            "    \"QuantileLoss[0.5]\": 237.42051115154754,\n",
            "    \"Coverage[0.5]\": 0.3742724867724867,\n",
            "    \"QuantileLoss[0.9]\": 126.43710828056938,\n",
            "    \"Coverage[0.9]\": 0.8600529100529097,\n",
            "    \"RMSE\": 0.024357985735489782,\n",
            "    \"NRMSE\": 1.5923233784275435,\n",
            "    \"ND\": 1.0264938241861645,\n",
            "    \"wQuantileLoss[0.1]\": 0.5136871870806926,\n",
            "    \"wQuantileLoss[0.5]\": 1.0264938320254469,\n",
            "    \"wQuantileLoss[0.9]\": 0.5466541671553133,\n",
            "    \"mean_absolute_QuantileLoss\": 160.8899021612912,\n",
            "    \"mean_wQuantileLoss\": 0.6956117287538176,\n",
            "    \"MAE_Coverage\": 0.06633597883597898\n",
            "}\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "yZ0N1TSH11Af",
        "outputId": "b65bd39a-1564-4c6c-ab42-994ab191413e"
      },
      "source": [
        "print('validating...')\r\n",
        "all_df = pd.DataFrame()\r\n",
        "\r\n",
        "valid_start_date = pd.Timestamp('2019-10-10')\r\n",
        "valid_end_date = valid_start_date + pd.Timedelta(int(context_length/24-1),unit='D')\r\n",
        "pred_start_date = valid_end_date + pd.Timedelta(1,unit='D')\r\n",
        "pred_end_date  = pred_start_date + pd.Timedelta(int(prediction_length/24-1),unit='D')\r\n",
        "for pos in G_POST_LIST:\r\n",
        "    out = pd.DataFrame()\r\n",
        "    mx.random.seed(r_seed)\r\n",
        "    np.random.seed(r_seed)\r\n",
        "    validate_ds_pred = ListDataset([{'target': use_diff_2018_2019_df.loc[valid_start_date.strftime('%Y-%m-%d'):valid_end_date.strftime('%Y-%m-%d'),pos],\r\n",
        "                                     'start': pd.Timestamp(pred_start_date.strftime('%Y-%m-%d'), freq=freq),\r\n",
        "                                     FieldName.FEAT_STATIC_CAT:[pos_group_dict[pos],meas_dict[pos]]}]\r\n",
        "                        ,\r\n",
        "                    freq=freq)\r\n",
        "    prediction = next(predictor.predict(validate_ds_pred))\r\n",
        "    yhat_mean = prediction.mean\r\n",
        "    out['y'] = use_diff_2018_2019_df.loc[pred_start_date.strftime('%Y-%m-%d'):pred_end_date.strftime('%Y-%m-%d'),pos]\r\n",
        "    out['yhat'] = yhat_mean.tolist()\r\n",
        "    out['station']=pos\r\n",
        "    all_df = pd.concat([all_df,out],axis=0)\r\n",
        "    calc_pred = all_df.dropna(subset=['y','yhat'],axis=0)\r\n",
        "    error = mean_squared_error(calc_pred[calc_pred['station']==pos]['y'],calc_pred[calc_pred['station']==pos]['yhat'])*10000\r\n",
        "    print(f'stations {pos} error is {error}')\r\n",
        "calc_pred = all_df.dropna(subset=['y','yhat'],axis=0)\r\n",
        "error = mean_squared_error(calc_pred['y'],calc_pred['yhat'])*10000\r\n",
        "print('*'*20)\r\n",
        "print(f'mean error is {error}')"
      ],
      "execution_count": 45,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "validating...\n",
            "stations 1 error is 1.3657812894717367\n",
            "stations 2 error is 0.9919208264666053\n",
            "stations 3 error is 1.1335393987023192\n",
            "stations 4 error is 6.842846012948689\n",
            "stations 5 error is 0.9820994508937451\n",
            "stations 6 error is 11.278863192804296\n",
            "stations 7 error is 3.167732332859582\n",
            "stations 8 error is 3.337866807158339\n",
            "stations 9 error is 8.828100933230823\n",
            "stations 10 error is 4.190931604146147\n",
            "stations 11 error is 7.229760668311233\n",
            "stations 12 error is 5.947048371901335\n",
            "stations 13 error is 30.25263444127636\n",
            "stations 14 error is 3.2148550309620765\n",
            "stations 15 error is 5.797407440324144\n",
            "stations 16 error is 2.31319440528638\n",
            "stations 17 error is 1.7926422612468622\n",
            "stations 18 error is 10.15757072442029\n",
            "stations 19 error is 1.7297708359129909\n",
            "stations 20 error is 2.984495400160004\n",
            "stations 21 error is 3.2794558543368155\n",
            "stations 22 error is 2.98027960100008\n",
            "stations 23 error is 6.673287866229629\n",
            "stations 24 error is 6.23406917503652\n",
            "stations 25 error is 7.159531231007353\n",
            "stations 26 error is 12.12602331007037\n",
            "stations 27 error is 2.8005058632901374\n",
            "stations 28 error is 0.9121983071390869\n",
            "stations 29 error is 1.234296167561323\n",
            "stations 30 error is 9.55839429768672\n",
            "********************\n",
            "mean error is 5.549903436728066\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "il6OIVyO2fst"
      },
      "source": [
        "When choosing these windows we ensure that entire prediction range is always covered\r\n",
        "by the available ground truth data, but we may chose t = 1 to lie before the start of the time series,\r\n",
        "e.g. 2012-12-01 in the example above, padding the unobserved target with zeros\r\n",
        "\r\n",
        "if the context period in the test data is less than the training data, zeros are padded."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "F6DltzRIJl61",
        "outputId": "8095df06-633c-40ee-9c69-74bab84de84e"
      },
      "source": [
        "supplement_period = [['2020-01-02','2020-01-31'],['2020-03-02','2020-03-31'],['2020-05-02','2020-05-31'],['2020-08-01','2020-08-31']]\r\n",
        "predict_period = [['2020-02-01','2020-02-21'],['2020-04-01','2020-04-21'],['2020-06-01','2020-06-21'],['2020-09-01','2020-09-21']]\r\n",
        "pred_2020_all = pd.DataFrame() \r\n",
        "use_diff_2020_df = pressure_2020_df_diff\r\n",
        "\r\n",
        "all_df = pd.DataFrame()\r\n",
        "print('predicting...')\r\n",
        "for pos in G_POST_LIST:\r\n",
        "    print(f'predict {pos} pos')\r\n",
        "    for s,p in zip(supplement_period,predict_period):\r\n",
        "        out = pd.DataFrame()\r\n",
        "        mx.random.seed(r_seed)\r\n",
        "        np.random.seed(r_seed)\r\n",
        "        test_data = ListDataset([{'target': use_diff_2020_df.loc[s[0]:s[1],pos], 'start': pd.Timestamp(p[0],freq=freq),FieldName.FEAT_STATIC_CAT:[pos_group_dict[pos],meas_dict[pos]]}],freq=freq)\r\n",
        "        prediction = next(predictor.predict(test_data))\r\n",
        "        out['DateTime'] = [pd.Timestamp(p[0])+pd.Timedelta(i,unit='H') for i in range(21*24)]\r\n",
        "        yhat_mean = prediction.mean\r\n",
        "        out['pressure_dff'] = yhat_mean.tolist()\r\n",
        "        out['pressure'] = out['pressure_dff'].values+pressure_2020_df.loc[s[0]:s[1],pos].iloc[-21*24:].interpolate().values\r\n",
        "        out['MeasName']=pos\r\n",
        "        all_df = pd.concat([all_df,out],axis=0)\r\n"
      ],
      "execution_count": 46,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "predicting...\n",
            "predict 1 pos\n",
            "predict 2 pos\n",
            "predict 3 pos\n",
            "predict 4 pos\n",
            "predict 5 pos\n",
            "predict 6 pos\n",
            "predict 7 pos\n",
            "predict 8 pos\n",
            "predict 9 pos\n",
            "predict 10 pos\n",
            "predict 11 pos\n",
            "predict 12 pos\n",
            "predict 13 pos\n",
            "predict 14 pos\n",
            "predict 15 pos\n",
            "predict 16 pos\n",
            "predict 17 pos\n",
            "predict 18 pos\n",
            "predict 19 pos\n",
            "predict 20 pos\n",
            "predict 21 pos\n",
            "predict 22 pos\n",
            "predict 23 pos\n",
            "predict 24 pos\n",
            "predict 25 pos\n",
            "predict 26 pos\n",
            "predict 27 pos\n",
            "predict 28 pos\n",
            "predict 29 pos\n",
            "predict 30 pos\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "cPj3qlBdbadc"
      },
      "source": [
        "final_result_for_1st_round = pd.merge(left=to_predict_df_1st[['id','MeasName','DateTime']],right =all_df[['pressure','MeasName','DateTime']],on = ['MeasName','DateTime'],how='left')"
      ],
      "execution_count": 47,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 283
        },
        "id": "GR4oIXyhbTaK",
        "outputId": "88c4f092-08a1-4ad9-97d0-b80596101826"
      },
      "source": [
        "plt.plot(final_result_for_1st_round[final_result_for_1st_round['MeasName']==8]['pressure'].values)\r\n"
      ],
      "execution_count": 48,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7fc79231cf98>]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 48
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAD5CAYAAADWfRn1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9ebhlR1U2/tY5597bQzoTaUjIHAxiACGkiaAyiUN4QKKiQkScfop8ivIhDuCHqCCIgPn80KiAIiKEgIIQTCAhQCBz0iGdhMydTifdnaTn+U5nqN8fe69dq6retfe53Z3u29yznqf77Fu7dlXt2lVrXquc9x4jGMEIRjCCEdRB61APYAQjGMEIRjD/YUQsRjCCEYxgBI0wIhYjGMEIRjCCRhgRixGMYAQjGEEjjIjFCEYwghGMoBFGxGIEIxjBCEbQCJ1hKjnnzgPw/wC0AfyL9/79Rr3XAPgvAM/33q90zr0ewB+pKj8I4Hne+1XOuasBnABgqrz3k977TXXjOO644/xpp502zJBHMIIRjGAEJdx6661bvPfL96eNRmLhnGsDuAjATwBYD+AW59yl3vu7k3rLALwFwE1S5r3/NIBPl/efDeCL3vtV6rHXe+9XDjvY0047DStXDl19BCMYwQhGAMA59/D+tjGMGupcAKu992u897MALgFwPqn3HgB/A2DaaOeC8tkRjGAEIxjBYQbDEIsTAaxTf68vyypwzj0PwMne+8tq2nktgM8kZf/mnFvlnPsz55wbZsAjGMEIRjCCgw/7beB2zrUAXAjgbTV1fgjApPf+u6r49d77ZwN4UfnvDcazb3TOrXTOrdy8efP+DncEIxjBCEawDzAMsdgA4GT190llmcAyAM8CcLVzbi2AFwC41Dm3QtV5HRKpwnu/ofzdDeBiFOquDLz3H/Xer/Der1i+fL/sMyMYwQhGMIJ9hGGIxS0AznTOne6cG0eB+C+Vm977nd7747z3p3nvTwNwI4BXi+G6lDx+Ecpe4ZzrOOeOK6/HALwKgJY6RjCCEYxgBPMIGr2hvPc959ybAVyBwnX24977u5xz7waw0nt/aX0LeDGAdd77NapsAsAVJaFoA7gKwMf26Q1GMIIRjGAETzi4wylF+YoVK/zIdXYEIxjBCOYGzrlbvfcrmmvaMIrgHsEIvoehP/DYvHsmK//a3Rvx+E7Ly30EI8hhRCxGMILvYXj/V+7B8997FXZMzlZlg4HHb31yJX7hI9cfwpGN4HCDEbEYwQi+h+Grdz0OANg11avKZvsDAMC6bVP0mRGMgMGIWIxgBPMY9sz0sHem11wRwH/duh63rN3WWG+mO6DlO6e6WL1p91B97ZzsYtPukRprIcGIWIxgBAcA1mzeg0/fFKff8d7jo99+EI/u2HcO/ll/fgV+5eM3D1X3D//zdvzCP99A7/UGgUDM9Pq0zs//0/X48Qu/PVRfz3/vVTj3vV8fqu4ND27F7et2DFV3BPMXRsRiBPsNX1q1AV/97mOHdAzfeWQ7en3OMR8MeNXfX4v/899xqNC6bVN43+X34k2funWf2hwMCk/FWx/evt/j6/aD1+NMj8/TA5v2DN3erDHX392wE6mH5QUfuxHnX3Td0G2PYH7CiFiMYL/hLZeswps+9Z1D1v+9j+/Cz/3j9fibr957yMYwOVtw6xpRTpccvNybK0wbEgADISwWzPaaJQuBfXWn/9rdG/Gqv78WX/jOhubKIzjsYEQsRnBYwb2P78Kltz8ale2ZLnT6B4ID31/QOLtbct+dVpwj88u3P4oPf/2BxrbqiMx0N7432a0nAFoSmDZsFgL9hPDc/NC2RgIDAI9smwQA3LlhZ2PdERx+MCIWIzis4Ly/uwa//5nborIl40Uigj1DGoKfSBgorlxUP2PteJv93mduw4Vfu7+xrSmDWHxp1QY848++igc3B7XRZMO7z0Wy0Cqr+x7fjV/8yA1432X3VGWW5LF4rA0gJ2Qj+N6AEbEYwRMC090+vvCd9fus0mgC3a5Hcb135uAgqXXbJvHQlr30niYWgqA77ebs+1+7eyPO/D+XRwTPQrqfuH4tAGCjCqqz7BAynK6SLMQbqt3i49JSyOO7ij7WqPfdtnc2ewYAFo8X6GRf1W4jmN8wIhYjoLBnpoete/LI32Hh/V+5F3/wudtx7eot+9zGO794J/7fVVxdM6UQqTj6aI8foEC2dz164FUiL/rAN/Hyv72a3tO0UcaYShYM/uEbD6Db97h/Y3BdtZCuqN3GO6HdORGLsu64MS5dV6SbRaXUAAC7p7kU0yqPpDl8EgiNYC4wIhb7CbO9wRPGPR9K+PG//RbO+aurojLvPb59/2bsnu42Pr+x5Eh1MNhc4VM3PoL/exVX12gOPCUSAj/3j9fjlR++NkJ+3f4AZ7zjMvzDN5ptBn/9lXvwYx+6OioTbt+yJ2vJYroiFpyD1+vmyMVjAIBdU2FupwzJQp7S6qJZg1jI3OglKmooa1wRsegW87xYEYue8fIyBqvdERzesKCJxR3rd+ClH/xmhvy890MRgOluH09/51fwoSvve6KGeMhA1A8a7n5sF37l4zfjPf9zN3kiBuEyB8k8Prh5D3ZONhObJtAqp7QPgbsf2wUgNtj++/VrMfDAh65sthl85FtrIvULANz7eH3Qmh6KEItOK2wz7bWkpQHh3LWdwiIW8r7DxE4IQdEzVEkWnTZ5Auj2Qu3te4tvtXQi1LXmW/qyJJYRHN6wIL7qYOBx7QNbMgJw4dfux9qtk1i5NvaiOf0dl+Nt/3l71k6qQ5aN/akbHznAI95/eM5fXomLvrn6gLYpapH7GhAmAKBkLlO08vK//RbOfs+VjY83uYJq7rfXr6+rP/vOqbkTKr1u7lxfBJdpTluDRqSyPjSnrd1h9XryFQHIn8/HU/z2hpAsZJ70uMRmMdHh21/bLORbn3Ls0qrMmm/pa9xodwSHNyyIr3rt6i345X+9CX//jRh5CsfHxOrUV/zfr1+LZ/zZV2k6hIMVDPb5W9fjHV+4c6i6O6e6+OAV+y/xaK68QhJDHJcuNZiExuhAShz2zA7v3dNvkAI1okzXwDAw08v1/ccuHTf6CtfMZqFTbUTvMMilBYtYyPtogmkFyUkdpoaykLoeg8ytV2TfkizEO0tLUk8k/OPVq/Hft60/KH0NC93+AH/9lXv2iSmZ77AgiIUs+JsfivPmiP97r98szn+ljFDeuCsYffvVpj04Nou3/eft+MzNj0QZRBmkfvJNsHvazvOjbQPSruFEE0Fl7BxiKLc+vA1n/OnluPXh8H2a8iFp5Nj0vhZyGxZ0qoqgwuFbRxNHIRYdRSy6BBEX1+X9fv58CgMihZg2i6q9XP1lqYv0dMl1X43LsllIWpMl41zqOpAwNdvHB756H9762VwD8ETAozumsN3wAtNw5V0b8ZFvrcF7L2tW1R5usCCIhWzgVI0kLo1dtfj3GJ4eAl2CpLqGgXUYWLtlLy6+aW5qLI1EHtqyFxd9c3WEpLpzlHRe/rffMvP8aCQkHKemFZrQaunAVWqoZoT25dsLQnzbIwEpNxGLLuHKNWxUNpf9JeUSbAYod1hFMfV76aFI8Ju29+qx6roydz0jLYf+vrLcIsnCNHCXkkEkWZSG6I5leFfX5exFhM0gFkLoNDOx1nAx5s8P8I4v3DFULq0b1hRedovGDg4K++H3fwMv+eA3G+vJeDaRM0QOdxhqpp1z5znn7nPOrXbOvb2m3mucc945t6L8+zTn3JRzblX5759V3XOcc3eWbX7YuSF0G/sIsgFXPrw92lRMsrACu1yJIruEw0oZ1427pvHdIaNYz7/oOvzpf9+ZqWG+tGpD5LrKiBRQJH/74BX3RQfcWCoJC+oWdqSSKPvVn2raUAdJjd4QnPK9jxeG6OOPWlSV7WmImdDfgWVa1Qjek+n4wZOOysaQSpVPXjYBIImdIHOr1UW6rnCiWvDU8zGICEeuhtL3Y24/JyxN31yvLmGa2oa6KFI5lWPQa84iFpXnlSr7nzsepXUZXPvAFnzm5nX40/+OVa39gc/UOneuL9bM8087trHdydke/vi/bsdjO/cvJfuuBkYSAI6YKAJEF6QayjnXBnARgFcAOAvABc65s0i9ZQDeAuCm5NaD3vvnlv/epMr/CcBvATiz/Hfevr1CM+jF/Z1HgjFbdMkWN6dB8GPX4KQ1/NTffRuv+vtrozLvPX7k/d/Af9ywNiqXRaUR7eM7p/GWS1bhdz79naxe0VZ4fmuJkPS4u8Y77AtozxjpQ1N1La3peRY11Czx2U9h9aaC+9Tc+lwkvIu++WB2X0sWTA11VOmqChTI5Ly/uwa/d3EcGS5PaQZDrnWbk90wVl0uHmWMKFjXmgjqNaHfQK5jb6gGYkEkC0tHqIu7DcQilmjz9paWyHMYaJXfPyVG7/zinXjOX14Z288G9UZ6DZ+84WF8buV6fHofHVGanC00VN/mIKmmDyYMI1mcC2C1936N934WwCUAzif13gPgbwA0Jrl3zp0A4Ejv/Y2+WG2fBPAzww97bqB1rNowKbpkrUayxHmByAvHWEQ7StdQXXf99ils2DGFP7/0LvqM3giCgLX7qoVwBDRXfCBtKHpuhHi1tGTRNVxYyyp6PjcY6gVxXdbz2ZS6o4mT1mosPRs/cMKRWV0hYlfevTEql9eZIcRCv6p249XlEjOhOfWegXSrwELNjHiOlGX2WZxFmoeqel7bLMpvNswqEVuFRSz0FugRY7oVJc6g7Tix+MzN68wxDGOOkojzIxcPT7g07J5DGpm52PUONxiGWJwIYJ36e31ZVoFz7nkATvbeX0aeP905d5tz7lvOuRepNrUbQ9bmgQTNgelvGNRQzeK8I8iv32Cr0KohkQxsL5qco9RIuWdsUNmMOjncXG0WdUDbUpOo+9WbWZC1nq91SjWkQZCx/g7MZqERJiPq+nmNRPTcMoRmEx6f3WeSRewCi+xal1mIVr559J01B09Gp9sKAXF8S+u+ZgjB06DLZe8wrj4vzxu0or0ZiFbMUnOxPTIMyLpxaMbg67dP4tX/cG2kAh4miaJANQdPnFb9kMF+W4eccy0AFwJ4G7n9GIBTvPdnA/gDABc753LWrr79NzrnVjrnVm7evHmfxhjpidUaEwO3XuSWCofZLCwcIwhc2wIC0uWLSI9BxqvXW9+QLMSHf3YIN8phYUDGokG/gd5Iem6FUMZup012iFB3b+k6qzm0L98RzsxgxGJylo8lIhbCkUacdkOqDKWKE0lLt28RJrmOiRX/jpWzRGSb4n1U7qzElqJjOrwhmcwQgqeBSUI9Y/3pdRkCABkRG8bdut6DLprn6js2w1zw979c8xDuWL8TX1oVbC1zUSnJuL73SMVwxGIDgJPV3yeVZQLLADwLwNXOubUAXgDgUufcCu/9jPd+KwB4728F8CCAp5fPn1TTZgXe+49671d471csX758uLdKINKxquV1zQOFR4UW/ZtUOHozb93LDcPHLCn04VpvLpvGWrAaQVcGSFXZ0hOPlezYzBCSxWDga08sY95djPCYaigSnRxnO61HHPodhSOdUFHGOrMqQ3TagK6/s75k6S+aYhRm+7nkYHG5jFjYkkXOrfdMm0XOpOgZkHnWLr3WWp6qzt6gt+l4LYIXe0nlc2ulYmEgfVhSA52DpO5jO6fwsW+vSQjl0EOo9qdFEJtAiOr3oGAxFLG4BcCZzrnTnXPjAF4H4FK56b3f6b0/znt/mvf+NAA3Ani1936lc255aSCHc+4MFIbsNd77xwDscs69oPSC+hUAXzqwrxYgFu1D+eryZLDIgNnn3C8zcP/ax2+hdcV/XRt0BSFZa6hHEO0waiiRjiKbRY8v7r/88l04/6Lr8IBKVqcN/vJukccXQTjaiebxnXnciX5Oj6tJVaJdmEUNpTO2PuXI4C2lRyV+/c9RHk6xZBGuZVwsohng3HrsGltPAGK303yslguqjKE7B2+oiOBVzEiYrylDPbZmy57oXYB4rerxypqwJAtvEJG0bBiELX3ZaqhwbamAL/jojXjv5fdg/fZgHxMi0xoCg7dJmhqL+XrvZXfjtR+Jj7HtE/fy7xVotPh473vOuTcDuAJAG8DHvfd3OefeDWCl9/7SmsdfDODdzrkugAGAN3nvxc/xdwB8AsBiAF8p/z0hoCUHTwTXWCddv6qHUfcIQmA6ZWvBMsmipXQwlheNIF5tO9DjGgx81c41ZQZYbbD7uX+8Pnpu0Vg7UsWx6HSt+9XuiPodBOkxycIywva1GkrGaKh4NDx52QTWbp2M2TljvroEeWkGYaZXzIH3vhpvl6gxLYQZf6f8vkZyzEPJUmkxNRRz6Y3aNCStbXtzt059NoYnBM0KyosIC3GdrcaV9ZhDICyGZEGkubTm2q2T+RjnoIZqVx5ZalwG8frYNQ9lZVJ3GMJ0uMFQ7gHe+8sBXJ6Uvcuo+1J1/XkAnzfqrUShvnrCgS0cDZHbqUEA5sIhVRuMGGStNdQjxEIz4LF/fih/0hET2LR7JorATj22xhNDvmWXma2QYz1BtFJScMmCEAv1YpaBVOIsIq48MhTo8Qhx1hIArUpjAbRkMdMtCWbfKwN1TgwsNUVsy8jXTKTCiWxDg+gZoE4NZXPw+s265rrP30EbomPJQpAy75+9Gy+Lxzw528MVdz2Onz07aKPl27QMZiKWLNh76fs5MR9GneTmIFnU9Zvu8+tWb8Hr/+UmfOuPXopTn7SUPDn/YUFEcFuLW0Dr3a04CjG4DpONttLzasmiXy9ZRCoJIoVYuu5jlxb2kcd2WsQilxIsXba0q9viBm4VvWwEC1YEk0hXGixX5D0z3WhM6XVkhK3cO/N3AQyDvXotra4RtdlsJI0qqCQL3Rfvl9o3LENxRYRUW6YaipQhR9SW3r7JS4uVW3X15LB1xYgzALzrS3fhrZ+9PToKd7Z83nT/Nb4pg9hOWT4zxN6VrpucPCwIzinxO3z6pocBDHfk7NRs/4BkZj7QsCCIRSw25x9eL/LIBVUh2spnfh8lCxY01TMQ7edWFp7KesH1jY0vQ7QIXuRlRTxuNEi7a7fyFA0S0Xz0khDQFunzVbNdon5gbqcaKfcidWCuVrEYvBBJX48c43GFwl0qRb18p11GEGSwWRhEjBm4yViL+6GcI2X1DsjrMsKk6zH7ib6OJIjIBpCvGdZ/Ua4JYT63TO0HABtKm4Jet70Ghoqp4qztGEXCl3UtdZIGabfd1vbCfZAskvKte4pYj2OXcNd5DS/70NV4zrubMzMfbFgQxMJSE1RlqtAyCkqQmH78zCcfUdtfpMMXA7daRd+8L7gCa2IgXlrjasHe/eguWrfaCFGAFueKmHumBmnLUklMlHlvmBSknwesnETlwUEG18Z04Va20xip5u9jSSS9CtGGuvqAJqlqHR0a1FC6f4OQMw6+cVzNRIghSkbEbPtH3lef2GUAHpfS9L4gz6dQIWUlRQQ1paWGyteyJekzlVN/CAmhcsJoNXuV0X69SBZx+fYy+ecwEe3sLJn5AAuCWEQGbrK49Aa2IpIlSleXnXPqMQBCPpi0PZYVVG8OnQSNLW7tNaTz5TCEormfrsGtM4MtG0MU/ax1t70cyWhioeeRESQmLXSjbxPKgyFZl/FN23ieRdW+p0gmkiLK2lsVsYgJVj4WZtTWfZhIecDLWbuxxJATYiZZRPPFLjVSNwzv1XwZUejReEm5Xmt6zh8sPRH1fpA4mcVjHKFaBJqVMQZxmEA+tm7npIYyDNzCfAzf0vyDhUEsmP5ywDftlBHYxbxNupWuPF4Csu+Yvl5vjiXjYVOwxd8xU0jnG0FvStsO0Ivue+8x2xvg+NIlVZq1Mr72SEBarIYinJ8O0CIH8VjpVTzBfkwPXYyrHtGyvEv6CX0gkTzWM4hYRQAM24Ml/YSxcuLKVGnR+6ppYmooRkgtG8+APB87gai1JOM1iDYjTrrMYgaEGEfEolx3E4qB8cY7MMTP0ukDoClLLBCGKFKlzUUNRTQIgCIWw+ix5yksCGLBPCMiw6z6gFNEsuj1B5Qj7Q9y5KfbY0hRG+8sxCBgBb0yDis9Z1qAcUUBaRf/RLqQ8e41fO7lHWI1VL03lG5AvI4sRB9zz1JmIE/G/RJOu7guv6PBPbM5srypmGpJ45KmCO7Zfv07mMZyIt2w8Zp2ClIefQeDkAqiNesaUlVV1/i+AjrwVNZdOwr6NCTPBsM7s9UNY7Ngh0XNJTFnFZSXWC2q79Pw/FzPojmYsCCIBXOdjXXtoW5ksyirWJ4x3WqDx5sneAKFuswbykoqt7w0JFvSb+wlIwSNI6QqPQWxn0ifou6qxHVjwQpnbrkVRgbuGp970y2RIMdh1FBdYliN1UHx+K1x6XLbWJ7Pgel8QNRFllMDO5GuyYuPpfOwUnxEj/t4fIDtXt4d5O1akgVLQ2LZXQRiNVQvageInQ+aoqqtnFUV0R4CEc8Qx4zpORALy3VWoEmwmGw4IfJQwsIgFv2cMFgusrGhr7i2uJt+hTxDmc5fxCSLYTghSZ9tLe5IsqhULDpWIE8bHtkTehaxYMQv9MWSysUeO766zzZF8IbKy4rn1TtWfvT1fQ2Mvpgdoc8oCDinbOEVaksxVFKVdKSRL8kqqxmMWGpUw03Gl9ZlNgtT0iJlVuBqUCequgZhqbOlpG0w0OpRgd3T3CuNqTk1s7KvkgXbp+mhaSno4wNCug8rKC/GCV/97uPR+1pp/OcDLAxiwdRQxklrTI2wRWWgZPl89PP3Pqa8lrTNQrj5IfTELEbhvGceT+s+WJ4FoZGQ9mZiKRSEw5bxS64mxjXrPpkbJOPAtSdRnMCun5WZxlKCtJmeuingUrfFmAYg0auTcQP5mrCM2kx9ZamhqlxIDchXX9ueSDm1iMeStxUzAhyrN3pDNQQLWsQrGzcCstdIX3v2NWWdtQ6OYgc4AcBNa7bimgfi5KTMwC3Ewor/eP9X7g3jqtRQAax4mY9dswZv+tStUWr87hAE7VDBviV4P8yAGUZnDS8etvHfd/k92fNAjuydc1g0FhLfMQN3LEob6i1CWI5ZGmIbpNmNu6YrtZl1FkSvIgyEcJlqKDWYcmRNgXxA2AjRKXWqLpMsLAMo640Rpp4xh2yDdg0k1yV2BAvJMWmhMZGgaqtL4lJMpoGoe6yYIaYTt9Rywb7BEb21xlldRpwsdMeN8Pl4La86KlkYRCyWLLga6bUfvREAsPb9r8z603Mn3L510JLFeFZtGv1LZmZ99OxcDlo62LDgJIvgGcO5EMaBnX7cUlWm2iUxDDpgLUrUJgfORIs7XDNPIlam29VEQb+PPmWu4l6Jt5SlhmpGyhwJSXmkWooIQ95+t8fbbeSqIePimysiHESysFRD8qSligsEIOdc03Gz+YxSkBvSwvrtk/jUjQ/Tb26mFkHeVxxnl69xxqAkVWlQXpN3oSUdsb642o4jet1U5SxhEIt+ZL+wx5ICV0MVZeMGsRhXZ5kzTzXLVladae902fwlFgtCsugR5a8VHxAjhuL3acuPUPf5Qpa6+nAjvXiFe7AkiwHZoHGGUj2uEsmrwKHo4KDZPKguTvsRIx4JgqrUAGyD96w5Ipvd4C2ZaskSu9Pv0HbNgVa2YbXsy/BEYqqHWMrJ27UM79G4B3lZjJTz7zzwHhd87Eas2zaFlzxdpeSviHaEibNLRiTTcim2DMZxKpXcjsAIwzCpNKRKzEwQwqOastRQ7Dx3S7JgEp4Fs0SCFvWpFVmu46FYcKXFpMgQrQPE5hssQMmi+J019NdNaoSIM2jQP+vrzaXdw/RAIRu0yZff8rNneu3YZjGI+h/PDNzhHeXSyrDLEJKlTmIcZ9eQQpoijqVy11BDMWRvqVoYEbEli/x+U4YAq69K7ZdwnhvLtO/M+G+9A/O8isZAvomlSqvmYOCpaomtWyvpIfsOtoG8HIuhQtJzPl0dDcv3EyMcQ9Czaj0yRwLr8fEoMabsXdWmwdDI940P7RoRi0MKjGvqGsFklHAQxAVw7sVCIqL31IvIzN5ZcSe8LtV1h6p0cQ5nsyj7JRjPtg2oa4KwmtJ3M+Oydc3olcWJsc3O4m3qxsAbludDGxaRY2uCqXtS5Cnfh6WesZAnk+pMt9WK4KkiQkz6rNDq12yLE6HQVl435sr5Gp/uMbWuQeArVVozImbBt2xcej6f/pRlYbxEK2CtL/m+U7O5jXE+woIgFoyT6RJ7Q3GfLO5oo+h2c/FRIzS9YIR7sDnSvJz54eu6FkfLDOdMspAy0cUyrrlCUnoRNyEOjSDA61a2I2uDkz6YFGOPy36+5VLinCPwpihl3ce+npTH7Az6epqcR9HkDWUjbfYO9YTWCgpkCNziiNkYrIOUQOZ+lqjtgFh1I2Cq0sgJfpYhmWYUaCCIOpcVszdaZ8NPlziBBQLPR1gQxIIaCsvf8XZriKAqfp+d7c1c9rz31YIYJhCKJpUjhCHy8mhoNz5n3Edllc2iQhKq2Qqh5WVpOZA/H90lm81KNMf08QxRmhHgjKMtLzqtVmKgzp8zppZyl7bra1wvG6MnZep6hqjoLE6btWWp0jwrM+qysqY5sJ5jdRlRjuIljASHQQ2l6hpjIBlLsHE3T9bHsiUzPGB5ULK9Gwd9hnJhIDWBsjzj5gMsCGLxM2efiAvOLY4RDxuluGq3XI1tANEz6f0eIQzM3XGmN6BSirVpegnnn96v8w4qnmd1w4KUDSFtis61Ls7C4niavFksKaSOMGXlCbLXIO+VusDHz8d9tVp1yC8btj2upP20LbZ+GAKwxsKSWtqINu+MjVWPwSYmPi+LECKTxECBSZmWhxMbV1OCQ7AyY7y67C2XrKLjZek+wroOZaa9UJxHjPnS462yMJs4gQ7xkMFQxMI5d55z7j7n3Grn3Ntr6r3GOeedcyvKv3/COXerc+7O8vfHVN2ryzZXlf+evP+vw+HVz3kqXvv8UwCEBSnft9Ny5odnCE1Dk2ujNBVtesNjo9p0yqiYekNJUFCa1bbdcqaqI0ghOacjRCWNs2hEnsmmCYfck7oNBGAYwqKjtcPzxbWoEzutlskdp+/Vds62jyR1nYsrsD7084xIWZ02L8sAACAASURBVEi3IjaGpMZtFsZ8VdwzfzMm3TTNAaL7fIyhf6Mv8u6NkoXmyo0U+GwMZu4wstZ0oK2G6nhbQuSi75x7W5d9yTcPhV3jqGb2vtbczAdoJBbOuTaAiwC8AsBZAC5wzp1F6i0D8BYAN6niLQB+2nv/bAC/CuA/ksde771/bvlv0z6+w1AgjGfY4CXiaLuIC+CbvfgtdN1qERCf+SZiY6mWmFdJKvF0qkjrsk9RIyUErzsYBGmhbFdLGzc8uBWnvf0y3LauOKUsuM4KUo5z9qTjTpGjJH7j+YmMd5e64ECRDJUsfPQO4RnyHSLiypFbKCx+UndJapA1JdN8TcRIOe/XkiwE5uINZRqwhSA2qM80GDSdjtsiQvKHdQAUk1KaJCkzl5Ye2yCfG+12rqFesqj/znoMlr0x3TtpX5Y35XyAYSSLcwGs9t6v8d7PArgEwPmk3nsA/A2AShnovb/Ne/9o+eddABY75yb2c8z7BC0XI1rhDDqtlrlp0m/VbjlzITMEnn5q57h+U4/HWmT9gUenJQSgfF5JBumCq5BnMi4gpIf+1/LA+XEiWbTix0396cD7irCEurQqJxwGEmKbkeVK6hnzzdqS9+sk80UJgGYQkN/X78MQor7cV0TMcpJZKS3YlHvyXqb9hHHSQ3zHOkKedsKM9E2SRUxc82tdFqusvCrPCYt5wBKxb7CklpbNIvU0zN6HvFCTZmO+wDDE4kQA69Tf68uyCpxzzwNwsvf+spp2XgPgO957Lf/9W6mC+jNnZN5yzr3RObfSObdy8+bNrMpQEFQlsnAK6LSc6Q2Ve9G4aMF1+wFRphyFVg159XzMheReS1YW11iyiPsaa8eIstv3lWopRaoa1pSBgmm7BbFIOXV9Hc+RqMfYBra4pgohGaqSqG/VV9qu2HdSgjmIKUDUfzshLKzdyr7hYimEGb5N6YkYO6P3aiA2cXGOaGO847OyObm4ku9rebUhKhciZLRFiKud4rycryEknmbiGIBJFpLZOQX2rcJ3UuMiLuNASOJp7Rc2p5Yd9HCULGrBOdcCcCGAt9XUeSYKqeO3VfHrS/XUi8p/b2DPeu8/6r1f4b1fsXz5clZlyHGW7ZV/V/rrOptFEoFbII7QZl+pe1LCUiDQeAO3k+eZC6ElhhaSRYyUhZMqOOWYCFXEwudtpZDbLIIaimVhjTci0Mrq8s0xF+TF6vK01OV8p2oocl05NaQEgEyNjLvlaghL8n3TtqgUQREtn6PoOTIHTDoy7QXJb1YXeV3W/1DjMigeQ45M9z+MsVwufcN9QBm4Vd0Xn8lxyYAtTORFsQdluBZp0PKwZGs8UlPPYwP3MOk+NgA4Wf19UlkmsAzAswBcXQoHxwO41Dn3au/9SufcSQD+G8CveO8flIe89xvK393OuYtRqLs+uT8vUwdyGElqdEyNw8y+UCH7RA3V63uMd1qY6vaVGilvV/cVEYCG4LlUHxvUPTFhGWvlRGgscYfVGWbTpIBCLLTdpZ1KFgYCoGooWjNZ/GSzR/0Rzoxx1UHtl7jDMmKjGAQP4KEtezPCkUoW6frgqpC43xd94Bt48rJF1I5ACYhGQgaGYDYe5iFnEgNfJK7Th1VFPTUQ8kiaIDh5qDgLssYZ8bUID1MXmlIfec6SPCQJaFQ3uZ8+b6nKpomLvO2VFrcPcA/L+QLDEItbAJzpnDsdBZF4HYBfkpve+50AjpO/nXNXA/jDklAcDeAyAG/33l+n6nQAHO293+KcGwPwKgBXHYD3MaGSLJIPVCAOg8OqEEdxUeBEhcC9x4QhWYy1W9kGarccNYrrvqwAHu+DITmN4O60Y0TZI2oo2YCLxtro9uMDVli6j1Zq4DbiDvS4mqSFJrdRGxGG51uG3afTTtWJut3wXkAgAC/70NUAgGedeGRWVxpwrmZcxjuu2zaFddumsGS8nT2jgRWb8Qo1zxR95PdT5Pr8916FE45apO6bpDrqM22XfVPzftZqrH6lHnJGv03eUNbbBMkiJ67SlnN5WTpGixnRSF0iy23vsLyPYQz68wEa1VDe+x6ANwO4AsA9AD7nvb/LOfdu59yrGx5/M4DvA/CuxEV2AsAVzrk7AKxCQYQ+tj8v0gSVgbv8W36d44sfyD1MWpkU4rN2qc0CCvGYC6P4rVRLmcHWo92O+xpUXHXuOttJVEOCVBerFOoCEsFdqZG0FJMQTN2/lKcSj6XeaPJmaRLX+7ovH/eV21jIpjS8xwaDEKfBJAsN3KMr/47x/fpxaTCz6FbFHPFQXTuZ28d2Tmdl+RhJ/1a75e8waVc4Q8SZgqZxpfvYagtQjE4DQWOSi7728SSE9tU1U0OZKlxZ16rCnFLPHGQYKuus9/5yAJcnZe8y6r5UXf8VgL8ymj1nuCEeGMgM3EIAanTSmWTgUvtGrtunRlSFeCxjVrpwOu1cPVZJFgkSaiXteu+DHaEsE5XX4vGcWLCss1aGzbKD6rLvA2FKRfg6FR+TQqIuyHV/INJZjkxSQpxuUO99ZKfyPV23IEIDkhgyNXAz5GVxv9q7rO69LAYiBo+//so9OPmYJVH7090+fu8zt+EhdSaCqFXi+SbEpAF5phzxF2/bgP/92VX4ybOekj1n4FFKZJrTrPNBNrk7W0i5OvuCjCW0VSOZku/ImAJABdoZKjEG+vmNu6Zp+XyABZGiHGCcY4k4nEvcEcMzqdEwlSzgc4lFgtS0MVzudVouc4dVTQEIBKTwA08IQGKlDwQP6CUbJY19kHYXdXJiwY5VDa6zPrqXgve5gVuqpuRGkHJ/ELaPtYGph9Igt6WgmgPbxnLn+h341Y/fjN9+yRkAcmmhUEO46Ck9twbuCt8hekddN6/ApFiWxyiF3dM9fORba+Jxw+P6B7fga+qktfA+9VJMoV7T6y+vm77qv177EADg4a2TyR27LzZfVi6tVBJPgRGD+L34GELWWX6fEXXWqrVWozGSNP+WRMKYDU0s5hmtWDjEQlBXypXX6qQr5Fn83U64tYH3kNge/eFbzkWbNZJifOD8mMtuFTvRiV1BPQJSZi69SDZgK1EjVTYLIlkwm0WufonHovvKDdxqXMkGbjuHvrHRTE5XpC6fq8cqFV/Slh7v51auBwDcurYIQkyD8rRBP/XoaiULhKrSGIGIxgh84rqHcNmdj+EZxwf7CHvXVLKQT8tmzPv4vIcwrrzdtFYrkzx0XfZe+f20nAHDkxZXzu7be5Pd52Ok6kDkda35YkjdkiaZR6DlHcgYsb5hG5wPsCByQwHxaVRA+KjthHVkiy/mMjmSqTgsQV4JEar6Uu0xY5a2WcTjVdJCMtZUvVUQrHjs0u4ictqXHBcpC3UwULaYag7UeyUbpR3EkLKs+GU5mIKjAdmBiOtW7yNlypai3xUg6iLV7O7pLoBwimHq1cYInkAaW9OoZiJIZOA9/uLLd+OWtdvB9P0aUptFanvSMPBcEqEuzMnjmRdY0m7WJjg3na7F7C8mITZIIUNJKQSsuuwccR5bY81XEzHIa1pIv0misdbafIAFQyxy5BeXC3jvSQBf8dsihIW161C46qZqBqmbEgb9/EC73ibjSiWL2KPLGFdZJoSJ2SzEwC3jiZBnQgBSNdBgQGwpiivX44rdfxH9psA2WCFZxGlM5F5KnCN3xMoWUfSdeqV1+95WU9Z6heWjZ/p4E+H56Cd7XvfPk/N6XP/gVlJK+k1mOp8vfZ0PrAmB21JIPgbbMB9/07QuLTO59gDcHTZr1pYAGt6XSRGmZEHezTJTjYjFIQLZ8rkKJ19YlcF2EH9MHYHtvS84eIL8CptFvmnTwECGWOoMqylCC+3msQApYanzhpoo7Rh99b45B68JQMxppYRFgEWB17vZ5hycfodiXPFzFRnIcjgpYlG9V/HbabkoQd10t69cheNvXuct50kZO6LVNnDnyDM9/EZSvDDDt/fAxTc9QsuzfpPHs/gRKjXEZQx3NRlvmxEtuR+1n/dlEaM4jkd///z0OzZGFgdU1x+9z+aeN0vXz1wkqYMNC8ZmYUkWLovm9ZWuvSot7ztCABjyc3CRN4o8k46BqaEijx01fu+1Giupm6jHgJxT7tcRizGRLIo6Mz2diBC46u6N2D45G+ZAdRXZEZJ3SY2skS2FIMqmTcUM3IGI2RtNDKpCINotF50xMN3tR+co6+fTqP0mjy6W/M/kuglyTImCfEfGZdoGWZ+1myJKbaNxiZhhISlKLMImofWYWqXJZmEhdSaJxWPhd1i+J5b8cRiX74H3aCNlzvLn7APV8nmyJIsRsThEkKqW6pBy7llTbFqNOCoJIEF+RWeFJJMu3iBZFOW9gQ/IN1k4jPNruzjQzqu6qRdXaksRQjDB4izaMfe6a6qLE49eXN3/zU+urK6ZO2wnkWIiRAtdNxCx8F7qOkEi4jlVnRUyILEmqi8NLNBJEwstAUz3Bhgvpav0++ZBm/nG1+8wRU5wi6EeA6Q2iDT3WNRSA5KxkB8Q1u11q7fil//1JrzwjCepuvF3rOtrcraH3/jELfjlF5ySPW+NixmE9bVteGfP1NcFlPeVcT9dS9m49TV5B+YBN8zcscwEcb/zi1osGGIh4JPfnCPl+mvnioQhWYxDqhqSOy5f3HnmW4+xVguz/QHR9ydc+QBod1L1WNxu/A6JFFMix+9u2JnNSbBZlMRiuosfWLws6kOA23gse1BKAJAZw3VdDULwtOdU3xPXWaj5MpC6bMaZvhCLVrTBZ3uDoN5KWm+K3yjKQiGTLPR9FiOi208N3DLfLKtrEyqpQ1gy31fdU7jd3vjQ1qxujFC5u/O379+Cb9y7CWs272kcQyjjiDZI4jaRY+Oi14pghjgLi8jE+ykdI5OUUiYorWvHkuTXpkQ0v2jFwrFZtBIkVeH0zNsllxYK1RIiApAaQL1qtzBwhz581Vc8Jo/cjhFJFkld4xXy8xmgJaniV5AQi7WrvKH6AwwGHntmejhyceE5NJMgP2YYDfYNm4hlBDN5h9wWgswtmUWWh7m1czgJVJIFmYNUnVidfeGIo4FhOwKa1VC9fu7UoGc0tVlUtieCOQbe46XfbyfXtNQ9gCJCQ0osEcFUz0j2VjMynFw3SQ6WEwGbb2uMzVJKTpBMQ7RBhASaGIgm7y8reHJk4D5EYBm400ywzBOoQNQu8rnXqpaiTuA4qqC8hC9idpN2osKx/Pu1tJAGC6auoLpdGcOMUsEAqBINAkE11fdFPn7vixxSALB3NkZ+jDDl0lUBTiFaTQTjOQjvm2721Msqto/EHJ7lGq1htoyubZODb/LMuajGpWFA5lb3RImFqtEd+EwdGUsWiRqqrEzTgHhk8SW6vch/PyUWTH0ami3b4UhOj0VUkPq8cNaW7ivdb6GPeuTYlCKGIW3rWNaobuUyzscd70PyPHmHYdxwmedUVHN+0YqFQyxMjjaLBeBR2WKHyPXyiP723pcG7njxAeq0PoVk2hkBCONN10qeF6lsl3gopYRJNvPRpcTwimedUNUPNotBlMkWCIfKC9SpvAbJ5GpVWipt9AaDKEVFivU8yDfzrP8wLj1fDLeKUTuNYQGQGemtfF6amXjLJauwdsveqMI0sVnosfT6g5xpUHU37oqP+6wM3EwCyErisUfzkbrkVpIForEU1/nzHp7q2K2YjLQt3UcTgWjyWrIlF9KXlXYjYnjqETwjeEBc94q7HsfqTbur+bAN3PkQTDXVPKMWC8ZmYRm46/X9YTc7cAN36mIqfTkEBJ5JIZqwVBTEV2XSbhZlbMY+5Iswdemd7Q0w3mnhAz//HHxp1QY453Dp7cUhhtobStQgnZKATM7EGWqZgTqVrtjcBIeA4u8Lr7wfX7htA37th0+r2o2RPYkrAXL7CHx43uBYBeTd2ImamRoq+mbqOyiPrJsf2oY/+fwdOPf0Y6v7U41qKE+lAQvkfZnNYuC5CbRJVQLkjEf0fNJOem2d5sjqsnZt47Bdpp+3gNW1JIsYKefjsjLUstiZgff47f+4FQBw5KIcpXrjmrWvYWSzOESQ4OSYI00of2rsLJCUHIvKiU3aruZINZeathvUUIh+W8RLyyVIWX4zNRS0xFPcmOn1MdFpYfmyCfzmi86IuGuxWTy8ZRI3rNkCICQXTNVQubooty3IbY0UU4J5y8Pbij637jXbZSqrzLwt853cYftMPKDYoYxpSnaUhFy+42dveQS3PrwtIo5AIbE1Gbj1+prVkkXyDgL6FDeZ2zl5Q5EylkbEapc14FV/PYNrpmOJvqnPymj6FORlZpvRGAlBNVRLrA1TYome81kZkwxSxoe1y9RQcb/zi1osIMki3aAB0aYftp1g9Sj9BaJb3GaBWF+fSxYBq1o2i0xaQDDMZoQl4X61vl+roSZUEsFdU93qWtRQn125Dp9dWZygKwfaT86mkkWNyit5X210ll8Zl8R77CzHkXHw3mO8EgFCeSoVVITJxfW4zWKg+oohT5yocnwB+JPP3wkAOGKiE0lMs71B9J2oZKGue30iTSZIYbzdqohUarex2o3KDSlEQ8qkxO2ScalLfR4FJWIGsperfZYsyHzZKp56RNwUdR29D5kGU5XmyTMGAeBqKDWuJi/sgwwLR7JIOO2A7PNFlHlDIVdDiVGMeeeIm60dZyG/udup6d9P1FBykXHlyKWQme6gkiAAYMueoBt3zmXqNAlSS20WWWQ3ciLI3kG7FOt2Ky8txBAjylCW9mUbyHOVmbitMm+oNKPvoJRidNoWKddSWbc/iJB2k2TRGzRLFmNtV9UJXkv5mAfeU+mCtZsH+9UYuBl7rCBOrU8qmMieleXIs0lisu6zsbB0IskQKdK22vDExmOd/FdXVoyhgUjNM8liwRALFuMg5Sn3Q/M9uTiTbB6UJ8+XSCZSQ/ExMM5RSyE58kulkOIeDywM10Bxgtd4RCxmo/lJ4xfGypiOvYnNIjX4gvTlVV09JnkvICBVQWJpu9RFFba+PxUWtI1HQPTXmcoJzMDNJRDNTABy/nm4z7yC0pgOl7wXG4t0IX31GZtpIVU1X3rcGuoM55a0USE3jRwbFOue/GW6lRIlTvS8J2XJGKtrxrVb12RcdmaBeJ8CiFLHUNpp9FtpCAb5uNPr+QALhljI9s6D6mxdeVUGpb9O2mlXGz/+srquDrTTneu+uGShx8CN8QCyw4+YMfzRHVN4ypFBF/4bP3pa1FYmWZT6nlStknodRcQ1kcHZmR4hfUXxK8QiP4XQio7nNiIZ180PbcPaLXsrAq9BJAtGBOh3SL65jEsT1rF2zGykkkXqqLB7umfaXWRuxtotJVkUZUyyMDlPxmEnz1eR4QZhSJvxPoyziZOOn8sRIUOYutxC8HV9Zs8RVZo1rrBs64lUPEb+zZnUZI8hH7eGwzLOwjl3nnPuPufcaufc22vqvcY5551zK1TZO8rn7nPO/dRc2zxQkHJz1QZtpcjA07pBDZUTG/239yjdbPO6zECd+txH8QjJwqv0zIOkLrFvpJ5Ej+6YwinHhlPWzjk1ePAAOVEQA7eVBVWPK1elFb+pig8IhuhUQssQKPT7Sl+8HhC+7y9+5Aa89ENXY89Mj0R7h3HlZSnBK+o55AhAz0Ga/iSdxzSOZ+dUN1ellX2KB1ohWSRqKKbeGBicLOF+sziLGlvIYODxO5++Ff9+/VrVZs4oWeOyAkTZ8025oZj9w+S+GwhTUx6yYQL42HzNRJJFPgY7U/FwxGS+QKOB2znXBnARgJ8AsB7ALc65S733dyf1lgF4C4CbVNlZAF4H4JkAngrgKufc08vbjW0eSEgN3NqbKeZ0PMazHEw63UfyfGpHgBCWnGNgRCj3hlLjShYR86aSMaScUkrEun0fqaGaoJMciKTfId104j2WBgvqd5CyFH/3DXWg5uA/dOV9+Ma9m/DCM56UR7F7GVc8B4/vnKZuzQB3d9Yqr8d2TgWk7lIHCGJkL1VmA5/HWQgzsnisjaluHzumulhapolP32Gs5TCLYu4rNZQg9QZDcjye+LcYNycWqZoRANZtn8Lldz6evaNAz1CbWOBQEhvCSRPc2aw6MhA5IwC2FJMTANt1tr5drYYa0rksa4PBfJMshvGGOhfAau/9GgBwzl0C4HwAKWJ/D4C/AfBHqux8AJd472cAPOScW122hyHbPGCQGrgFcj96EvyGEpkQD6fs8CPhtEndnCuuOwsi3+yp51Tl0ZUZuFXCvrK82x9U6a6HgbGEqxfQadrl3XJOOdTV7wqwVOKhPEUcQoi/ce8m9V6WGipHFoZgQV1nNQF54V9/AwCwdLydOSpoTzPpX4j+oO9zNVRJxCbGWpjq9tEfxKcYPucvr8T3H1/k4SoIdB9jWrJocJ2tjZNQZSmxkXavvm9z9vy6bZNZmcXxNgYL+rBmmGqoKftr1JR8cwP9Mt0/k1zSd2ASAOvXane2z/1z5bLJI8uSlA7HOIsTAaxTf68vyypwzj0PwMne+8uGfLaxTdX2G51zK51zKzdvzhf2sJAZuBVSJn0WdRHqOueiiGStxtJ/F8+nWWcD96zb9d5Wj9EU5Q36elq3vNPr+yjFRxNYkkU7UeJHCLwsCwSAI3VdN0gWCXLzLB05z68F5IS4SA44vBoq/eZFPUcM57GB3EOYiaJs93TBqYsU1ypjYPQ06vnaOdXFzQ8VMSfyfdqt0G+tushAJgzZprYJpqKT10o94Io2+bwxNVT0HNjeC/ebYhTStnQ72XXNM0VdTZjyOsPlhooZIiCRtEjdJknInsL5RS3228DtnGsBuBDA2/Z/ODl47z/qvV/hvV+xfLmdNK0JZJ03eR0VHDyiOt6H5IA5sUkIgPSnNpbuq3ynqnZ+RkVcN2rD0P2maqg4+rko6w0GFQEYBn7gBJ51NkPWGoFX8xXmpno6m4Pib+0NpSH1OpImKpsHPP7lmjW47ZHtoS811JleP5rDZRNBiGaIMj2DuxhUVi1/3vtInViNv3yvTuk+rNtNAyardssbY+1W9e4hPQpHhXUG5mhNZJIFIxbcTiVtLhnPFRFU7RIhc2YDjNeqrsueZ2Nh18zAbXlrUQJgEB6uhgqF2lOtyX3XInSs5/kmWQyjhtoA4GT190llmcAyAM8CcHXJnR0P4FLn3Ksbnq1r84CD1vev3rQ7BGiVHLw2uObnaqOULIJePU1pkRIW5gmU2Rx8ncTjso1SBYll6p58A2kdvPce3b6vVEvDgEQRpwuWeUOl6rGqbisMMjVECwQDdx4rktI2bUzfumcWf3fVA9W91GYxNdvHYoXcjljUwe5SP9+qkLILsReJ66y8q2YQBNqJZMGkoL5aHwOf8ohF3dnExUnUhJ22q9prOs+CqU5Sjz/2PA9MLFSy7FxveI8jFo3lfTWooTw0Q5UjcGZ0bgq0s9VU/DneVn49VILCZE8DcaZgIY5effN99XZquH3QYRhicQuAM51zp6NA6K8D8Ety03u/E8Bx8rdz7moAf+i9X+mcmwJwsXPuQhQG7jMB3Ixit5htPhEgC3bjrmn8+IXfVuXFBz79HZfjR7/vuNhlU3FCpRki8swBco5UAu0cbK5cEwbLwM0iyzMiJGNo1dgREPL5z0WyEA6eRf42GdNTqeu2R7bj9nU7ynZjiNVQ8TukCLg38Jgo4z9mk3iGFPdN9wZYGjyFcYSSLGRcnVYL3X6hcslS2JdjSpM0AjznFZO4ivKSkqsmpO5Uou4RNVSn5SqiWB8P4YfOzUTViQlIkSVZMLXeMAgvjZcx1VDkfkp4srKa/m9csxVPWjqunjeIVLKf7J65XSW1i7ScQ9/7RiKUSuLp/cPOwO297znn3gzgCgBtAB/33t/lnHs3gJXe+0trnr3LOfc5FIbrHoDf9d73AYC1uf+v0wzb98bBaJpTvnb1Fhx3xAS3LaBAoKs378Eta7fhKcsWAWBpRCTdR74IWWqQ3Ghd1k1cMkXdo4mQ5dEVjcsHFUZnDjYL3a+GLIUSuKuxjMHD42f/8fpsXAIB2SpuXanXoroDXxGxlCtPpav+IHZxXTzejuoCcfZZmRp9gl6IxI/fOZIsfCzxpFCpoZKxAsDemdRduZQsWsEbqi6RoAdHlhWyr0E8bLj1Kq/h7Sap62umUjXa9OoZBgypW209uGkPPnjFfXjBGcFF3FQzqf1I65LndFmcYZZJz1a/9XDYEQsA8N5fDuDypOxdRt2XJn+/F8B7h2nziYQsjbaUZ0g5z6sknLpzwObdM/iFf74BX3vriwEgs28AgtTzVBdpSgkhLKooSBYMKcNlaqBiDNrzSiST8LcgwLE5eEPJUHMkYxvTH962F1+8bUOsHjOIjYwzslkknCVT7UhRTixctvs0ktKEoZIs1CQLAdA+8y1HItaREjaUakruLl14AsUIVPrfMRUzLjLGTpTuo7hH1T2+XkeeuiJrqHMftlRevJwTMf1cvc0iqQyYiDq0X09MgOK0RwC4a8Muep+qoSz1VtRHTli4ik+xCJHkkF9bRKqRmhxkWECJBIvf1LVRezgBYlgtrrV9QtRQApKNte4wnpzTRlTHl4V6DJWBWxm+xa201QLglGQxEMLgsueDNxRU2vEYQXz+f72wSuRnAQvKSzktQWwf+dYaAMAf/dT3F+9ACFvKgUfpPqRNQ7LQSfh6/Xo1lIxVQLsNtyqkHMpkXLF6y2XZbIGYkBfcvTATOWWRbxNLFkUDm3fHZ1eMVZJFSPcRIq1zyWDgDQM34cCbgiv1uLokrNvDU4nDOj9aj8VKllncJ5JFtL4I9jQQqh6KfE/TU4mplpJx0zEKQ6PazQ+WAtBXdQ3JYkC+E8j9+QILh1iUvzTCVv098PlG8ghqKIGA5HJpAdbhR5nEInmkXLaRtHTjKo61RCLJnokJUzwu74FuOZDUZpFGcUdjlXcnkkGWdTYRWESS4Zx2PPbKzRY2wUNVNxwslSK0VOIB4u+oxyjtxmooLlkUmaLZnQAAIABJREFUY41b1oTHlwjblfVTp9PKwE02/qpHdsTtllSoFdksuGrIkpSLsrzQCsrTYBFioJRihswjZUl4n7zhYdz2uVX4xRUnV/0xTyEzIK6eVsQEoBzYUCfl0VfIiZg1hvQo3CxdvqH/akrJfliqob4XQBZs6kPuNEuLUrIgaijnXIRwxGVTc/BlbaWGGkTtMOQj6osU2ad2E90uIyyRtKKf9+FAo7l4Q7kKGdUjGY9cWhDu3DkHn1DMaiOVzfYHudRWqe0SIqS52C5RQ6VqBN2mHnfKtevrmV4/foap0tS4BqXUULyDouRJX2xcu5PoaVETOoQswFYEt6wZpjohJguiKsnH1eR5xSSLZgN3sOd8/jvro2faLj2HJWYWsrbUWHhf4Xq6F2c11s+ndaktxLoWBK/KmuaWvWPaBoP5RSoWELGQDcqOCY0+iidGa4WoBf7qsnsA2K6zEbef2Czyui4TSeMzoV1VNyYs6h0Sfa/m4NPT7+rgFc86vjprAuD62HQjpRLATC9IFumCT1VxfR8yyabIID0re+CDkT8lFowM6nHpIcr3jSWPXLJIHQqqdtVzj2ybLCU0prDibsWMqwdiNaF0Ib8pohZptE6K0OrP4V1nOVHwGE5iKeraRBvQJxbmXnzFbxNXr5/h15J2xbYBsBtGv+p6QMZg5d1iUkg0ggYiNZIsDhEIgphSh/lIpGxqs0gzyYoqiO3xgPxiaSHWwRe/qQpGu9lmKhhyWp/oxfMcTPki1i65ooYaJoL7n375HADBayx3CCgkh3d+8U787x9/evReAsKdp/YNgHiKDPQclGUV5xnX1aq/VA3FCFMsTeTXkWRRXs50B1E9pk7UbU13B/ifOx7ForF2LQKOiUVWLRpPkFK0HSEnjoVqKG8nk7DApCOmhqqTLLx5pkZeV13DXh8d4vEnz9DGjPZZeeqWXNRV+zxK7kfaja5zghQh9YyQp+Pl0gTzwkoGPK9gwRALoPiIe2a0mgFVkjMBarOodOX5BqtNwZEtdC0tBMlCSzfMZiHlgQiFRdYSMaYaa9m/kkwqyaLGG+rc047F3tk8qRwLDNy0ewafuvGRyvXTVEMRXjtFqH1feJ9JG/dv3I2nHr2Y1x0ElUZu4CZ9qe+o7wsh1pJHkCwSNSUcBj7uK10fu6d7WDLepsyESAsan1iShRi49V0ZV6oXlwBRPV6RZmVqtESbcr916T5SwiTAiIhRtQLv8/cVrp+dMy/PVM/rthqQqx7e3Y/tyu4zRK2fa5IAdB1dltmTEqeXqC2jXXZ/JFkcQnCIT4irOMdkwTIxUghLCvmhOSEWwDTuKsIiNgvhTlJPIK0jdUDGgUvOKnk2lWKAsPnr4iw+96YXRn/L/q6zWcgmSZHBTGWzsLn9iGCWyPu61Vtw6e2P4p2v/IGiboKU+wNfzcFsZuAm3LPj11QNxQzckk039SRixmE4SgSkboRojc+gDe5yJUVpEGK75TDdHeChLXujvnpKNaUZl7l4Q5nR4mqCZb6p62yClNsuZlK05FmX3ypNLknVVAYBoG3WjLGuLZ4bKpSZpxA2SCyMOGoYeOD2dTvwrBOPMvOcHUxYMIcfATlSa5deJ1G4vqqnDW4aKUdttgjyc7F3jt60GoSwaNVS5vqqNkhhZI/tEwURC8SJ2UcEqc8lkaCARfD0O6emEFHltAgGT20WQHBQ3VqqvgQB1sVZpJJFmg23GFdODHST8f3iVyNl8bzKXSOZCofTgLocTClUkoVQRDXGNK7EAdgz04slljTAU42tzvgfxlX8cpuFj5CiPG6dwb1++yQuv/Oxaj9okPXRTiSeGJHm42NcfXS/gRFvtIUYIo0uXrtlElfftykaX+6pVjMGahfhc3D7uh04/6Lr8OGvh7Q2hxIWlmSRfMR2qSuP8/Pnp8xpF9cUcjtEkABQbVqRFqQ99ZuoltKcU9W4oA2uKOsGhCbjTAnTwPsKsc4lRXlFgGo4UrmTIj9BbEyyoJHOCjkCwLFligYrOR8z2BbzYktBwWAc5itynaXeUNJXPFwuWXAEXKfuydpw0lZQ4AW1W47sU728tPudR3bgrZ9dhdc876Sy3GFP4nnFONV6m0W8T4Q4W5LB+f9wHbbuncXyZRPZ+pjR3nIWN19ujmZpIef67boBuMsur6ub/c1PrgQAfOLXnx/aIs4Huo0mV2ALHts5DQC469Gd9RUPEiwwYuGgl4FLkBRQIOAsNxRszrFCBlrLUEohGaIUm4XSveaqpeI3z08VVB3pSXsyLo8cgXuEmIQ5pfsw1FARsvekDJLxlc9XNVYfl+m6ldtoqoYSoo1cB89ULUz1JM+n7VM1lHNR/IfAGcuX5u/luE2LSiGWHippDwjrK3MVbjlMJjYmqfvey+7GdHeAOzfsLN+j8NqKnldjXb5sApt3z1TMDE0kmIxBopQtA7dIiSL9aphVasr0ueqalTGbRvIMi+1hdfXmHHiPy+54LHq/NGVJCvq9LcmiLpvtXFRp88V0sbCIRfJ3u5VH6EbeUGWZqIDqkEGq99SBdqEM0d/whb4+Vi2VkoVL21XJDDUBcTFhCZJJqNOrvKHmrnWsU0NZZ4LMdAdZAGL6fKr/Zn1m3lB9b3K/cm6EBqZmEhtR0X4uWUS2gUqyiBs+/qhFSEG3q6FDOfi8XlHuqvtSpTI6E724EAvR9qVp6bWUmXuPhUFMyNkbdZIF0rxZKPvidatrn+eGilVqTBnDo6pDPY49xYZnYVdLcpjtD/C7F3/Hrkuak3NLACJZpEF50R82AUn/kGlrOjPkYMHCIhbJJtWHzAgUnJAguvBhLTVDbgwvVSVRWVz3L758F/oDX9osWpD8QUCOgCPpBrHoLl5aAgOlhtLnfQdvqOElCwsZpEn00jKg2Hwy1tTDirmSpp5msvksyQKu2V1R96WvtdqOSRY591w/B7p/auCuUfekIOrCdisPyuv2UhtN8CpaPNbG5Kw6v6McbiUlke403zDejokFS/cx8D4qryMs0TsNfPZtgrcclxygypkUEYhgfr92havK+ptqxE8fI2U6TY4pWcyxzRTkXeZL2o8FRSzSzWxt2rRcCAirndo34FFJAKnhTJqVoyxXnHpMFvhVbQTlZbV972yBDFpxTEZ/QAhegsC9D3r4fZMsUqSsiIUijBpmuoNqvnYluacCEYrLdBvVWRDJd+grxJOrofKxWwZu+ZJjDYkErc1KpQXkjEfRH5FGDYwmAaNHTHSqLLmOELG0XSEWMi6Zm91lMr26+A8gqCdtiQeA55IFY3ojQ/Uglyxmev1sjwDN3HzqOivtfv2ejfjCbRtw4tGLK/VYCuzkSQGZJ+sdmC1E55izHCAowSNtWob3uv4PBSwob6h0L7RNAlD8yieSGIe6TadoReYNZfXP6ubeUB5nv+dr1fM6grpw842lm+ANher5t3729vK95iBZJONJ3zeqS5CBNJCfO5FzpGmLlpE/HJSUG52bEKJ0IkgKSJILlmWpZOGILURHlsdHoeZjYITF8oYStdKS8Q4Wddplu/m49HgB4MlHFmoxQVIy3lmVoysbgyqUebDGJcbsYaSuFHqUWAwq21GkUoouffSrIWW+/vbK+3HZHY/h3sd3m6JFfk59gF1TJL4o6i9vT0tZmbNFMgZm4LZUYgzmS7zFgiIW3HU2r9dO5Ej5VLxu8btlzwze9aXvFlwTYgkg5YQERI1UiNNFLX1UKgDs0iJyiege3TmFP//SdzHTG1TShjyr9dRFHyF5opwLPRfID83R4+fvNSvIwBWHEGlge7mwB5F2SZwFkMfGWO0yNZNmD7RkwYLfUqlPQAtoUdQ1G8McJAs5oOn4oyYqySK4zqaSVGjkpGMkiDFur1LnNYxhrLJZ8HGJi2s3mRvAQmQxIjXVUMNIFkwNVY2hsPUJl797ulvraWZ5TqWOAul99oaaQJipVKgqzZMy3m81xw2BjwcLFpQaKv3orRb3TEnjLCo1FOPQysJ3fOHOquyUY5ckaqjiNz/4J3C64QS+eIO/58t3V/XFG+qaB7bgmge2ACjcTPXaTE+p8wB+7uwT8YXbNuBpy48gs8LBNlCHd5BbWZxFb1DWc5lkQSUTxN9BNl+edVYZ/Qx3RQ2asGkDt9TVkgXzOhIilifxc9lzLWcE5TH6bHDwv/miM/ATZx2PXzjnZHz7/i3Re7HEifJeYnOwjnalTI4qlASTlpdWqwV0e3wOaDyEKut7n32bmV7hAJFJ2sSmwAhIZLNAYIL2TPfMd8hS66vrNIYl7zd/SeuAqGJcMf5g7Ta5BAPaRf4wkiycc+c55+5zzq12zr2d3H+Tc+5O59wq59y1zrmzyvLXl2Xyb+Cce2557+qyTbn35AP7ajmwDVdHACJDsuMIiatlUhE7Vg1BlTqXnu1d3BMkow3EjGvaOdUNLrneKwQe1ASz/QFOPy5396wDg0GLbRYVMmLIgCOpWr14CRWxoLaBYm7ncvKbvi6QelHWHubwI+QIMU4dUly3jbVkvQODsXYLv/RDp6DVclhUJnOUx7M0JGV5p+B4irqZJBaPd9FYfqaHHqP1zVrO0ZMJgZyQptAfeOo6K0WWOobq9pMrWfdCLPbO9KLx//DTnhS9QyzFhD9SQpgOhr0hS+MuIGN4bOc0Pn/r+rjZGmlD+pLnBV/NE1rRTCycc20AFwF4BYCzAFwgxEDBxd77Z3vvnwvgAwAuBADv/ae9988ty98A4CHv/Sr13Ovlvvd+04F4oTpIuQHbZuGq+pt2TQfbQk1dDQ6pgbv4zQiLD+dq595QBhFKirWY76O+Qt+zvUHFfe4v6Gaa1FAMqF48KQrnYfA5AOq5/apMfRu57VR37PS82cSI2261aPS0QEdFXUsbrF0AUTZfBvoVBLHL8+u2TcXvJsQv0IpsDgaJhDbWbuGE0u03ko70PJFxtVwuIVop7AEiwSfj2rBjqmrDVMfUqF5SbyhZ27tneonhPrZJUTUXeFxJUyrxOi8wGcPvfeY2vO0/b8fGXdOqXfI+xvOCrw4nyeJcAKu992u897MALgFwvq7gvddZu5aCz8kF5bOHDJhvPmOl5GP99eX34Nz3fR3bJ2crFVBeN+8nSAtpefz3mi17M93vIEHAWofebrVqDcx+oBZ5WbZjchZ7ZnqYGJsbsbAkAKaGyjjHfvCGGqbdtKhKYU3rFhz8MCkWdFk1boU0tBpKEHxqxJ3otMjpilxiqdoiEgsAHLGo0PpaHLwGISwWUpJmO61W9f1TxiVVQ421W1iS2EL0tRlL5HLJRh4nXraZ2obvkbKu2iXxedxMtx+rpkQirwIquzGTkkboMzUXwNVQ0fuQsno1VPEra2nt1hAQmdoms758eF6kl8OJWJwIYJ36e31ZFoFz7nedcw+ikCx+n7TzWgCfScr+rVRB/Zmz/FifQGjyhpKjU7fvnYVBV4wI3eK/PEdPXHf3dK+QLFqhki89nKSq5no6hkE+iPS+akeG9e83PIzrH9x6wCQL/b5WIkEZVJNqqKqaIClJqd42Is4dGiLLS6BBeQgImBm4o9xQJrEI14KQWi1UEdBjxBYCBA5YSzdaNaTfQAzcMz2OyDSBCJJFXCc1cI+1XZx/KmlLj0tDq5UH9QWbVjMiY9+mcjU2JIute2dx3t99O0a0ab2E4HQHg+i9UtdoS4pJU6mk9+FzVVqdGkrmWwj+bI+kS7f0bwjzJeM6BKiRwgHzhvLeX+S9fxqAPwHwTn3POfdDACa9999Vxa/33j8bwIvKf29g7Trn3uicW+mcW7l58+YDNdyy7eEIQK+0rFLCYnxIB2TeEHVSiD79Thv/9CbttOulmw9/fTWuXV0aRhEnPpyrJ5Rp7FTF375/c/kO7HnexjB2DHlnmoNJONohgvL0JgtqmzDXWgIQpJ/GWYx3WkPbLCo1FCFCuq5+/shFY/QdxGaREqq0rvboG0aySNOIAKnxv7jWzEVdfisr2pvVZe9gkRpxhb3qno1ZwzpZpvdpRgMt4cVnrFtHpVrHyAoMfM7k1EkWqXMIPXOk5rqSTCQXmtnTwYVhMMgGACerv08qyyy4BMDPJGWvQyJVeO83lL+7AVyMQt2Vgff+o977Fd77FcuXLx9iuMMDS/cB5JtjarZf2RZSYJJFwVXrrLM1dgjERlQRQ2XBnfqkJVXdsVbLdD0FgI9f9xD+4HO3l33FG2fOxMLa4EMQEcCYF/CFn3K0vQabhc7SG/rP60YpvxX3LLgh8oYikkXLhVQYcV/hOlLhlGU6+DG2X6Aag4z/yMWBWOhZWNxALGSNssBDgaDOK8oXjbWrHpoCFkWyAfi3ZGpSgVTYoPE9Ll9LWkqxstlOzvaqc1Qk0I65mwLxMcISZ7Fq3Q6c/e4r8eDmPdW91C1Z+tLXGQPJ9G8lBM/7og47B7xOImtXcztPfGZLGMZ19hYAZzrnTkdBJF4H4Jd0Befcmd57yaP7SgAPqHstAL+IQnqQsg6Ao733W5xzYwBeBeCq/XmRfYHGOIsS9s72igXApBCDAOjYiarc4Kq1fUPSoUvdpRPhE1njtdQ9esMtWzSWV9oHsDj4NCePqxkXfz783VXHbmZ1DWJFpT6GqJUUpxF5hxAL5xwmiFE6sk+IGsppdQ/3OmpVhCW0tWScG71FsrDVUKF/aS4zcCeSxaKxFnVKqE4gLDA4gIJYSUoLLlmUktgQCK1OjWLFM1h6+rPedUVot6qbjwtIvkMpxVz0zdXYPtnF9skQtc0Oe/Ie2DXdxdY9s/A+n4N6ySL+W9MVdoBTGs2dEuJ5ooVqJhbe+55z7s0ArgDQBvBx7/1dzrl3A1jpvb8UwJudcz8OoAtgO4BfVU28GMA67/0aVTYB4IqSULRREIqPHZA3GgIWjbUw3a0zwsal013xCydSCGHYhctMT+DiEbIutm+IzaK8q5FXlSgtb4GMIf776MUHhlgwYHQ0JQC6nD6vioUToyo+x9+XxjioMrksJIvSZqGkBkHOcRpuUFuPzvReqaHUR4sM3EQVpteRRGrrMQLA4vGiE0uykLZ05HimhkpsFos6bUyX+nM9X98q1Yn3bdxdjUwTsToDdeolBQynhpJvnpgGKmg6rrUYQyEt+IRJEegkRNt7Hx1+JkDVUAB+9qLr8ODmvTjrhCNzm8UgRMdbUm5QQ2liEP8KEds13cXOkoDJ3IrtbpgsxQcDhgrK895fDuDypOxd6votNc9eDeAFSdleAOfMZaAHEp68bBEe2TZpGq2t8wq4x43B6SodaQjK4+NpqV1TndTnck638DLifTWN6+glB0iyYGVkHltEzSB1m8qE06OE2BhE07cJqpYgcWk1xWLC4TvnqPpOv5dWQ7UI0mbSjYYJy8BdqaHC93/Z9y/HN+8TO5EiFtJ+0kGalHLRWLs2Bchsb1AZ3IdVQ3Hjrad1NbiStlqxD0xgScmHCLM+KsulPiCorLaVqdM1pBl9BR7cvLfql9oxy3YHRnS9zL+W8H1yIeP99X+7Bbc+vB2vfPYJ5lG6hxoWVAS3wHFHjOORbZN2Ph/ihdMUwKdBOO2QnsC2WQC+5E48LvjojbhhzdaqDSB2Wez2/NAIOD3naMn43D61abMwJQOHZNvy54029XvVqaFMoPYkda308iH3VKjAYiAmOi0zw6xAyA4b3m0syjmVEyw9CYvGtGThsnL9/XVdGZaWaNKhbtkzG7W7aKyF3aXLv21Tkrq6r1B3vNPCbC8wLU1up+nzUV/OTu7XZ7EPGQdfGPGjPGOqq8jRoGTI0uy9QLOBm6VZ70eeSvXq5j6TLFSgrvfArQ9vB1Ck8pG+KvXY/BAsFlZuKAGxA9QlTsvA4JQtZJIGHJVNZCCn3Q28rwiFtAGETKRAsXj40Joli305UnVYYKkbnFDMhnEVZYkaqm+roVhf0gYZWTyesoQdBsWI6XibEwtms2i3uDdUmxEs1ZYmUqxcS5aLCQLvKCcNKwW9FE902tVEWEkl5dUit2JVNT37gkU/DxNdn+ZPA2JPoGFsu+INZSWlHCc2C3Y2BEvJnhKAOjUUG5dugQX96XgqD1+NtcjYXNyTb295XB5sWJDEQufvp2ooQ/3BTiXlkoUrReTYaMG4OUklkhOWou5URiw4sm2CA+U6S+u6HCFog29Ubsyhrlm5zlIDtzEGSjDjPmSswq1rTyemhhrvtGqNu0D4pnotWQZunVZD4KlHL6bvc86px+CXfugUfPAXnlOVTRDJQvfbxPx02nZMhoyvyUg/ITaWGsmC2RYExnQ69GQM3sdparJ2MwReSCbpca8CqWThvadEKE//nkoW+VqsizGqqlaq5fwdtIek96jmosjIUPwhzg1zOuHyCYQFqYbq6LTSQ3DloWx4RC3C6b9d91BlVGN72Zdt5778xa+WLGybRV6WvsNczt+22rTKi5lxSZkz5qZ5vpvSfVBVWMMcaOQqm1AjX6aGGmu3DH19uO5UBCCoNMdI/IZ+Ts/ViUeHU/diFUoL7/vZZ2PT7pAqQhM3RwmAJS2U610RliYpObqO1GMhsBDghzIxdZHAeLuFbj+s6biqIEr7uNao3VZBVEw1VOIaPdvnLquy3oRIpNkXeoOcSUudBzRUcRZJXf0OvqqLaBJ6g1zFZ33Xgw0LlFiUkkXiOqmNVik4xwkD49gHSlr4S5U1ln10yaS6OfHSkJpTyhvmuScfjVvWbsvHdhDVUFTicDlhcJZkYRE7Vbf2O8AmZLTdEionAwQPo0Xq2zEX1vFOq9GhIATlhXdj2Wz1c3pcmoOn9ihVxlRD7Varas9ULckzrXp5se20WzG3uxy9ZAzrtwe9euo6qwNM2fPjnRb2lnFLDsgiuIMaikkWMQhXrtU8TEUIBLWwVkO1W4WzQ08FgfZKb0RNVHokGWKdW2sVZ0EM3PpdZbw9+Oq79Ae+WjMz3RBPMh9gQaqhOmqDy8fWBj3r3GTG7Ux0ciTTGxSG6FRsZp9cjGe3r9uR9QcUufZfdOZxuOEdP4bzn3uiyW2nkL7CXE/Jm8vyLBB4KlkMJ/FImS6tgvLod6hHiBZ8/d4iT+WjO6cx0yWSBSEWY4bNQg9BH38q5SyC2zmuhmpFxCQft0VYQk4q1ZZlsygf01HmFsgaZ6lQAODoxeNR/3mCwXrX2fFEOkpzQwmiZHvt7kd3Rn8LcbO8hrRrdLtVqID60dGwxe+skiyAnGj3+p7EWdhcf2qziCULj027p6v3FslCmukpNVQ1Lvp2Bx8WJLHQZxCIaK8/iBUMNtPNFZ4sQV9vMChF5KQN46vXca+Ts30sGmvjhKMWZ+NM6wLAMaWLbIpU9+VIVYGl4zwWQJelxc5ATBZh0+V16T6A4TePxjf/6yVPq67FZrGIxFlomOjwxI26TDyq9PuOkVQZbSV9aWTUJCXFOniNaEP70p7FgFbrvaUQIqnr4VWKfP2Ooc6Ri0MyRAaOUAu9FoW5EkeF2HU27D3Gjd/2CGGofGyziNVQWhKT1CC5fUMIXhWcmLxCtz+odZ1NIY2z0OP72j2bcO57v45r5LwSGTfCewtxl3EdTokEv+eg4gZbDscuLTilSaXusXISMWMeSwdRcC+uNlupwMB7uvOk7uRsP/aYYWOLxskRx1zVULofHf1NiRVyamGp7XRRR3Hles4b4yzoePMyvcmed+ox1fXvv/xMnHzsYvzQGeG8AxZ8N264zjKbRVulCo+QlHpHbWQXaFIx6Lvj6htqlZYmHLQNxRzVwcAH1QmTYsY7rcYjWLUqKzyv3kExZ6KqFdCGZL3VpKtU5Su2hb5h4E7fgamhgLDeIg+lyI6Qu86GJI3IQKqGM2rCMQKiQbh9ffHbahXSlZYsQpxGUTZfwi0WpM1CxNO2C8QiWnCG+oOJu0wN1S3PmNDGaWmDAfdMQTWumFjkdXWZXOY2i33nC5Yt6uDxXfX9p/2xsqI8lC0aa2NPeWCNnvM6AzecZeDOy/TXWn7EBIDiQJwfPOloXPPHP5aNV+AZxy/DvY/vxljbme67AkEdpAzckfojIHUdGJg+n45BQKu0mMSiI+XN2AkhJkZcUQU+ICh2JkdLMQCWvwRXQ4W2xomN5v/7xC34wZOOhve+ktRSCaDvfbaG2y1RQ8VnkAik6T6AOKlflVaDpLuPDNz9QU2SxmbJol8SAE2o9Lk13od92yeEaZjMvgcDFqRkIXO/fXIWz3zqUQCAn3rmU6r7VqAdOwqRSRa9fpFXP8uMaoylSdURRdM21HXGZt4fm4Wcw1Dn+ZUOSyNPa6zhNLgYKacJ8OK+hnfq1XvsqCVj+J/f+1F8/NeeT+vqvs4+5WgAwHi73WgP0tKR1E0T2Ml9HcBXvU9E6PPO9HcbI2qooi0X9WW9W2obEjixdN/18BVi0iqvNpGO6tx06yK4K+lAcd9fv3cT/u9V9ydxFrltIZWOK6P1EK6zcp6FRthSlR39mxq409etO3MlGLjDu6TVghSTtpvHUtUdtHQwYUESC0l7fNND23Ds0nHc+57z8Bs/cnp1X+PVZxy/DED8UX/yrEBY2J7p9XPuoGgjLxv4fCEV7eZIFYjjLtgY0qhdgbmrocK15C9aOt4x3VbTUof6jQTEp8Fpzk1y4jD/8nXbJ7MyG+JN9qwTj6K2iXRcS8sAvbGOq9VJn37c0urMDS05aGlTuH2dBNKRtqSNFCJi0clVQ5pIWSqtlrrP+nj/a54NAFG6b+Z55dT7mI4Grt5WV6eGgmKctGQhJC6XLIp6kc1C34/mNldZpWooNl6A7+e6Ey3TsjppQcYl86m9ofTz8wEWpBoq/byLxtoJFxIW5VGLg8FY1u842bQaGCdS1GVlPB6B+bYXbYeF/a+/ugKddgs7JvN8N1mcxX6ooSZUviBK2JBLEcMYuEW95hw3cLPnb35oG447Yry2XYG5SO+6L0E+VgS3c8D9f/UKOAe8rUwJXwS0FfdFEgN4VtrYQF5PxPX92GYRfl1SZr14DK2gAAAgAElEQVSbDrpj9/V0xVJMIBCacFh9sbPuBVJJPKEVVd0IQZaPp3YlsVkMSF0gjxVJ14PsMevIWIHuYGAi8CZVK1CqrJJqUSJBxTAy+8g80UItTMmCbdC24Rsv5w1EHAvR52pgYifAdcodbRnVdVXZiSrKV8Tfnzv7RLz8B56Clzx9uak20zDXk/KiWILy+synHBE4Q92By/WqBadd3+6iseAZo+e0biPOBebiRRITqwJ5jNd4Q413Whhrt2I1VDnrS0kSvlbLgbvOhusmwsFdZ4eRLPK67L6eL82gVPaRqC0+xpbL06rrupX3YammTHMwBQN3roZi4/aJZKG/Vxo9n7myO5EsiM0iMbyn81apkWjWaalTGripGkrZLIBqw/YJo8lSlBwKWJDEgiEATSAiV8FFSrIoy0570tLqvnPAP73+eVFbXRLxKXVT6LS4ZKGfP/nYcACSqGheoDx56hBA1c9+BOVJVs7lR0zg6CUFV+8TZi41/jtYhuhwHfIMcX27Td+KusxYqmEue0yPVRBVp9WcGypKUV6V5YbVWILUEkI946GhQwy2jKgDwYU6HmNoK+63+NXzpZ0qqndzzZ5VLeey87rZIVyBoVIxCMgRre4rRZotlyP6iKlLVHyZZFHOB5OEUsLSlP6dRerL2JimQYhNJRWWvzrOIu3rUMOCJBYMAcj5AUC8EZYtCn7lstie+dQjq/tHLhrDK559QtSW4Q1rIMRcNXDNH7/MTL0gSHmsozbCEGlI9scbSqSGiU4bxy7NU5075zK34pneoFGfG7mVNiDluL/iV3O/jODu6x7rVcTCUBGSb9NRnKulgqSBdARpWzCeZlEtn5Hvr5GMToxY2U0M1SCb+8Xq+UrlhZj4MXAuj0fSVYXA9wa5ITfODaXGx1RTqI9xKO7HddPlUJ1Ilx3RS1RWBrGQ0nHiAafTt1dnjpdQZRQo+0oJRCuqOz+IxYK0WbBNedTioAfXC0M8kRxib6g3veRpeMqREzTyt6g/HPLrEKPjSccsxv0bd9PnhFsZbze508aFc1VDaZCNMd5pYdkEIRbIubMiJQQZl7oOiMcmpAykdMl4B7ume2UbRLIg3mvDgLhiWmeeM2IRnYinHtEcKI+zgHqunlpQO4JqLz2/oaor7TcYwDUwyUKrC237SH5gE/OGknmJg/I8JQzydF2CwlDG7zNbSp2Rvqmv1MA93mlVrvKy9zUDNdXtQ7vkVokEjVgiffLkSA11COG40udegz4cSG8q2TSRd4ZzePsrnoFfVx5UKVDuktpKcoSUGodj5FMsQCuFtFW2P2ooeffxTovmwhrrtCgX38T56bgDWtdAboI0mw7o2UdaEUXncvsWlywEnHN4wwtOBRA8q1rOVd8g9oDK58MCFjeg3WHTXGcCMg1t5yIiw8YgoHNlhZgObqTXUKih6mwW4URC5+JPJHnSAG7gziSLhvlKTyncO9OLx2VgvwKp5yovDVXW2fLGOHFrzr3CQiP9hNikrxLveT7Ogw1DEQvn3HnOufucc6udc28n99/knLvTObfKOXetc+6ssvw059xUWb7KOffP6plzymdWO+c+7GqjhQ4sXJTYGIB4I+r8MbJptu6dnZsOnJQxRFtIFqG22D9YamtAq6F0W82Idn/UULLoLWIxbhCipnTqOu6AElJjSQjSZYcBafAonANWqOhtPs747yrR4Fibnpsd27dc9FuMxeHPf/osXPPHL8OxR0gupYBQdFtNrrMamIFbZ7u1jOWBi7XOAslLm6SYOkSbEgu9b2T9FA5CcTzDbC94HQ1lszDS3QukpxTmhmxj3ZJZStfiIKEEzEOSHTlbPe/jujHxjvfOYaOGcs61AVwE4CcArAdwi3PuUu/93araxd77fy7rvxrAhQDOK+896L1/Lmn6nwD8FoCbUBzZeh6Ar+zriwwDpz5pCR7eOoknL8slCw1afBQ1x22P7MDLn/FkALbboAa2DicIwu60W1F7Zyw/AoCt1xYDN+NkNOQ2i32nxceWRu2nLJswCB7HHFQw0CoJda4IG16Tdw/TE2vw3uO6t/9YVq7hqj94SZXvSEAy/S4Zb1eIbqzdqja/fl3h4DutoOduueK7nnzsEqzZsrd8xlUImBmXpU4djCs7lYwhVmnliDK9L2u/6YztWN8v9ZQqTa3aiU6rIhCMQdCpdNLAwsyOUOMNlSLoJtdsi+GqykzpiKVZj+sK4RooFW063mxs6jrEWZR/19SdLwbuYWwW5wJY7b1fAwDOuUsAnA+gIhbe+12q/lI0KACccycAONJ7f2P59ycB/AyeYGJx5VtfHB0uYoH25pjpWrn364EtZIZoTzx6Mbaq9OQ6Wpa1NWysx4FMJPirP3waXvaM5fj5c07GPY/tyu63DULU5NIbIsPr/f9TqKKME9VPCsPsse978hFZmeiel4y3MTUbiLMQiyh9dyVZ8O/hVJkOSBOIpJR9sFm0nOL21fO6rqyZtnP4i1c/E8879Ri88GlPKt+lee61qiR4YYW6i8baFbFgfMNZJxyJy+54rBxXPDcWUo7PqMiljXSMrCxVQ2V1LZuYy43h6eOifRDmLQrErLGFCMi7SFEqWeg2DiebxYkA1qm/15dlETjnftc59yCADwD4fXXrdOfcbc65bznnXqTaXN/U5oGGiU478hL59R85jdYTBAFwAjGUwozUYcTiDS88NUJ0HUIsGFcUn4OQw4F0nZ0Ya+G1zz8F7Zaj6U2slmXY2ntMv4scb+ucbc9hwPIXMUS7r1tMouQXj3WoRMYki9gtNb9uOVDJwpIyGLAzJnR8B5MyHIL+vdVyWDrRwQXnnhJcPocw4odvE7zW9DPaK63pjPimWBJ5xTiCu4A0NVtT+vjoDHZqP6sZQ5M3VDk+WSvLFmnvMYNYqLm5/M7HyzHY0o3APKEVB87A7b2/yHv/NAB/AuCdZfFjAE7x3p8N4A8AXOycO9Jqg4Fz7o3OuZXOuZWbN28+UMPF2ve/En/+08+Myt73s0Xag6eq08t+96Xfh+ecdBQu//0X1eoOf/NHT8fPn3NSGDfZNKlH0opTj8FxR0xE7bL8QdHCKX/HSDSvBl309xecTRMeDgtjatcNezzrv/zKimpgRy7Kff4BYJk6C30ucRbhzIUm19l922W//ZIzABRqy+NKtc0eZRxl0kBbcaOMK2+1XOXubH3bJol3PHKXzvvSa06f4CeurItIOv1Oq8V1/8RYrjlePdTFDbaj+ACnmKqmXyjYJ3S1oizPOcX6UqCqM16pzkjPjnDVIJLP3pmCWBypiIVJD2vGEHt/xXbMw0kNtQHAyervk8oyCy5BYY+A934GwEx5fWspeTy9fP4k9YzZpvf+owA+CgArVqx4Qmftgv+/vW+Ps6Oq8/z+6j76ne5OdyfppPNOxxAI5NE0CYQAIUB4DMEVdsJbQZBHZnAYHWFl2BXk89HVcWf8iCI6oLggKOiQRRx2GHF3Z3bHSVDeEomAQAwSBBLIs9N99o+qU/Wrur9zq+7te/vWTZ/v59Ofrnvq1KlfnVv3/M7vPTgdR/a144hp7X5be3MOD29YCQBo9RY9SaVz01kL8db7+/Dgk67ApL/rfMbxbSC5yEL7rUsGCsYRXTEFbhFns+C+4wunlsSfC8ClkqTMIp91fM+tlgZZRO/yjL/v7jmAWd0tiMKshgrTtfbwKRX1hvrwkj58eIn7emrPuZ62Bux431UXZsIrvPdPlhD4ou4buNm9TC63EkTmSPL3zyWLd710MF0tgXu4vq9RshAYIrH7hiWL4ioYk2RBkBiAe35EsFlEF8049SuvMllKHI8bGR5pi1yvNyL6Hq0NnFmYJAuhzWvcJxSR0kgLs0jyy98EoJ+IZhNRHsB6ABt5ByLqZx/PBPCS197jGchBRHMA9AN4WSm1HcAuIlrueUFdAuDhUT/NKEFEIUYRxa3rDsenTp2PlfO6xfN54cfMJYCoZNHZUpjjSFJDxdk/pB0pt7WMNm0Gf4akEkrGIezzd7TcZz/oM3+ym6Txlbd3Q1rZzWqosM3ClPOoEj+y9qYc7rhoKe68eJnfJqewD3sdBe2BNKG/f06W5OFkQpOwKHPXWdOi/N6eIQDAxJbAsUOfzTpy6VhJDcoli5A7rCGFvj7mw4ftTOZ63VIm2WLMIscSOmrsPlC8Rk2xOJ7CAL7w5ygtPB9YsfTthW1uI/ecIpKN4bVGrGShlDpIRBsAPAYgA+AupdTzRHQLgM1KqY0ANhDRGgBDAN4FcKl3+SoAtxDREIARAFcppXQR6WsAfAdAE1zDdlWN25VAR3MeG1b3G89L9ZRzWQfwXtoku3LRDVJ4y+JsFtx9MW7HGgd+L66bLQae9qHZkGJdL35DwyPiwm5aPKN1oolkldXuAwcLG4vguHldWHPY5IL2tUf0YvvOvf5nqewuR9gm4f53iHzJkieDDG0wYsZtZ7FAkoGbX80XQv0u8O+BqzNFF+dI9LM7Pu/LJAuDs0XOcaVqPnz0vTVFZYcN3B7NRewI+YyDoeHh0P15nQvZGF7QFLpfuG9UsgifbwxtokxMKDkN/F1Ii4E70S9fKfUoXPdW3nYzO77OcN1DAB4ynNsM4IjElNYBpHoDvI0bhx+8aoU4hr4ubGAMzmtdaqgQjvDGcY+u0UoWPCeRpILrail0ReaShZhnCAHzHFEsVw7bbZqZhTdWprhksWvvkOmRRNz78eXGc0ZJj/2QA5tFcJqrofTccX//kDtszNcU9rgJxpUWe30vBcZc2fZYe/MkUkMxyULauJjqreQyhAPDEVtKpNpfdCHUz8Lb9ZicyWp6NPJZB7sPDIeW47OOnIrrvazAohqqiGt2gXos5svJJXCdlSAa6RHxhqqnoDyLZIi6BQLhnSOXLLhqhr+WfHGBcCyNFT3fnM/gWKYqi3vR45CLuX5RX6HqziEW3JYvziyAQEfNd2gmNYHedS7uc4sUrV4wSWYso2SSHHHeaaa+vJ6Ffl6+4+VpW0ph6jyYq5gaakQpn1mESteOBG7AcpyFwCwgS3D8O+M0SGnxmyL1RApjJ9z/UvW76G6e05jNOKG+QHzsQzGbRfRepdiTjOot6RU1jFeXaqjxiic+dWLZdat72xv9Yz5GkhdK71BM+mc/zqKIrvvx608IeyBVULIA3CjzxlwGH/vOJt+jKQrHIT9eYehg4S4RCEtaPKWINhqayNYLycCsTjz3udPQ2pDFo89uL+j3tfOXxD1aYkRrI/jwPXXCNQr80wjadKQ7dz7IhSQL+YEfv34Vtr23L9QWBOWRfxPJBZsXNJLyRXW15GNjEMJpWXQEdvAM4YSOhe87H56rwgiFKpagIFG8zYJ/D00s3b2EUoLyiJIZ0znywkaxYFzxXvImR0oNUmtYycKA2d0t6Otsju8YwfevWI6HNxzn/0D4QmtK9KZx8oJJ/iJvqplxWO8Eb1zzWNFqcKO1WURjNE5f1OuXHo3+AjQTyxDhAy/6/di5QTp1bsjju2qNuEyyQPC8E5pyvheK1Jendh8tQu6uXJ8s5OqSbBYUUkPJNgvTejRvUhtOmN8TagvZLKT0FIIHHY/TmN3dgpvPWoivX7Q0NtUKV0Ppd5i7JYdzdIG1Fy4v0fQmpkWZq5wkO4Z7r2CsZpbwU4LMEOW+RFRYajUmpkMKmJTGLaRLpoG315M3lEUJWDG3C5PaGv0fcNYhv763tFsDgh3pyv5u8Tx/ce65bBD3XXFMREoJ0xD1px9t2q2c8Ksy2RW0tJBxCO97sQlT2huxbvFUAMCufYEdQTL4hxldId3XnjTXXzxMhvPbPnwEbl13eMG1o4FJlTfk6/7l3TWXNgI1FJcskntDhejxmVC815GvhoowtMtWzsaktsZYNRSPs5BSiJuil6XdfjQuxMgs2BzpS6I2C053C4vZkVBKhgCHUJByPy4bQRKvtqSSBSHMiFIiWFg1VLXADdxfu2Ap9hwYxh7mnSN51JgYBP/hdrbkcezcsOtu9IWLurfG6djjIEV/6/c3+q7nsw6w320/Z/FU/Hr7LkzvbEanl19q196D4b4RNApGXI5Pn7YAK+f14Os/34oelj2Yz92Fx8xM8lglwaSy0IuaW8/CBe+pF8OME0gWXA2VT6CalCDlaOKHnHlFXY1NY5na/GSKCDLnhqvqcZtFIPH4lRDhqkZ37h3Czr2sBLAgWeg54N58mpKooTcjSRYJdurSM3IQhV3PATmoj6cR50zfmFlHpEHuGjZwp4NbWMmiStBfdTbjLhLtTTljIJNGSNcdEteLLyLRhSy66IxaDSUMoBf6JdM7Qu16Qcw4hCtXzcFLt52O9uYcPrLUDXI7fn534RgzOgraAPNzr5jbhe9dfkxoQRwtQ4yDaWE56KuhuAtscD7w8qJQ4R8NKTanVHqky8KShfu/FMOrSbLQqiy+gEmqQ4eIlVB1c3Atm9kZfq8h5Xty//OIeTdlf2FfPhav5y6hlBT4DhUW8xLVUOw4b1BDmvoX68vMUADSY7OwkkWV4EfIRoKQNPgPLNilywtA3EIYn29ndAup9EK3NmTx8LXHFSTi04u9rp2gdfmL+trx6hfODMUrtDZkcfdHj8bSGZ34zxufAxBfp8NMY/K+5cCk3x5ihZL0LjOshtJtwdyEDP5O/CIjQbCxh6QM6Z0oRbKQijIRDDaLXNhoDbjPxSUL070SRWXDnZuDkQWcb5K4GmrV/B68/s6e8BjSMxqmm6dIKUaX2xY4ZgTXm8ctHCO+b9RjrFawzKJK8A3cbJXhL7cUCc3fJVP2TAlxuu7RxlmYcFREqgDCsRNJaDnJS/uuUUpEM0fNJAtdX8RxfPVSqDaKktRQo3ec58kDYw3cHortpIu18TxTvs2CPYKU7sMhMMlCfpeJEtoGCJ5kEaVRpuGeywaF5yloKnCHDqoaFtbkEKeOtUlJHpPAxBzD0mk6mIVVQ1UJ+iUwGWG52ygJ56Wdo/FeMd9iuevoCfN7sCymcFAU+rlMhV/insWUSr2zubCcK0e1GKKGiWEv9eZn/pQ2f7GRVEAOk7KiNZ/LgSO8H5zE0iSLwjYp6ywBBptF4UKZIQpF2It0IwjcLEa3jhwvDMorVEMVs0MUtgWNUVf0KBOT6OLveFxSSxMNZmN4+B1KQ6yFlSyqBP3ChHLGCEZDgNfzhdhXsm9wjFbyMOG7wg7NhMkTGvCHXft9ZsEjyJPQwtNPaHDD+s/+8sSii2y1mYVpV77+6OlYOa8b0yc2i5HSvFazL1lEc22XASlmglMoMV1jMakYZwufyVA42E+jUcgN5RD53ld89Khb8b4D4ffEqMIBijKWrJAbKnx9cVUbj++RpsmkIlw0rR3PbtsZUZ+aGIA0rnyvKA0jyqw2GytYZlEl6BcmlOfeIAHogkJvf3BA7hB3rzibRbUV+nC9XfYNjeC1d/bg0z982o8HicLE2PwCPUxM4rrwjuZcUZ1+lbVQPtYePiX0mYj8eI5AsmD2KLYRkHblZYNLE6LNQZIs5BdQtllQwbFDxGwWQV9RDeUQYzJ8IWWPQMC+yKbCrIaSGFq4D2COs4gz4kt53Uz34vjvHz8Gr7y928/s697LJN1Iz2ZQQ0XaB297HA9dfayYnXmsYNVQVYJeOEJ5kQwv0RmLegEgZPwtZX3X42YdwnOfO63w/BispG2NOfS0NWDZzE787FMn+gbHKOIYV9gJoNAl0wTT/SqJJ29ag68WiQr3izLxHEzeZthhapmohNTeVFzFJkHyhuJTJLtmm8YKjvUYUlAoIWDmyiBZaH7kkMycwhIRFdTFNpfSFdoEGqPv12fWLkBjzjHs6rkaKizxFNBteP/am3JYPL0jYsQXu4o0GH+akfY/7j5Qc68oyyyqBMnDybRQarvAu3uGYvtK0H2b8plQXv3gfOKhqg6TdKUxeUIQOyFV5TOhI8amUQl0tco1yDWCcq/MwK2Npk5gs4h6t/z0uuPxvcuTq/yA+O9UriJnWoiDds24eE8pgpsvXFLW2Qx7XpMaSoJJLSN7EjHphwIaOa4+cS5evPV0cWB+fallioudL8VuUpokVdsfsmUWYwhTadPlc9x0GOcuZZX2Sngv/DxBhvOjjeCuJOJe+IGZE/3jUujWQX+l5vOqJPSiyr9nzbx72xv9uJChiPF0akcTju8Pp/OIg57HrOOI7wqXLB75s5W48fQFxrH49bpWS8iDSQjK44/A032Qv2gHnlNcCpGkGA5pB2/QtIUYRKDxMizU7LjHq37IaTHFyfj3iuHOSSQL3WtmV3OkxTxeyPW+KAXVh7VZVAn698G/YJOnz+QJjXj1C2eG2iS9qQnBzq/Wr1M84nbE5T5Ccz6Dq0+cizOO6C1vgApAf788Pcpx87rwN+cdhTOP7PVTpg+PKOSzjtFjLAn8xSRD4rvCAxaPmNZetKgXZ+BfPu8oXL5ytr+gAnKKcqMaioL/eqHjardy3byLqXByjlOSxNKSz2AHwqpLU5p1jVhmwU6btEW6T0u+eL1uQpA2PpdxcHBEG95r+/u2zCKlKEV1pH/AaVI3mZDkhX/wqhV46a0PShqXiPCZtebd81hA77p5/WYiwke82ux7Pc+fYaXwq78+ZVSGbq0GymUCyYIPF1egiSPqebdkRthdOmRnEL6/RiE3VIbIZ1hS1TvTWNKunkiukKuZs+ME4xoXaoSf0aUFPtOO8ziMe235c83paS3SE2hgrsam1CB6uGyG3JJyCWioNqwaqkrwF4xyv+ASrgvy8aSfWyShcWDWRJw/OGMMqKksMgYDtkagwlFoaciirbF8OwvPSSXNaGl5poqfD9Q9hS6dANCYL9T3E/OcCkkWbMXRQ7U2ZEMeV1EQyfmRtJ2BQOZ8TGwMjVYW7T0iOKLE2Ue+ceHSwvG9/wumtIXiTnh8kO6Tj/G84k3RUsy1RCJKiGgtEW0hoq1EdINw/ioiepaIniKifyGihV77KUT0pHfuSSJaza75uTfmU97fpOi49YxADVXeAl7Kwq8ZUx3wCuPCVPuQo9FDF4kyxVHkhJ12ufDddDOyzaIUZhGbe4wF5Ulu2jwbga78l3ECm4WpvKk+7GzJ+e+FKShPYsCaWTjEn0GeWz5ss8csCIGE1iSo0ji4LWXuJEFyYDYTPp28+qJuDxnTDSswr+8S9E25GoqIMgBuB3AKgDcAbCKijUqpF1i3+5RSd3j9zwbwFQBrAbwN4E+UUr8noiPg1vGexq670CuvOm7wrUsGEtWxLum18H8f6ecW9SD9lIuTFkzC5t+9iykTGsXzUoxCudBj5JzAU4gPW0l3aW6z0MOaVF7aE8xks5Do6mzO4w+79gNQxvejqGRBcmnY8DMEi25rQ5A6XT9HnM2Cky2p+Pz0K5F2LmXoR2jIFpdiCMH8hsrQFvQcWySxWQwC2KqUehkAiOh+AOsA+MxCKbWL9W+B994qpX7F2p8H0EREDUqp/aMlvF5xysLJifqVYqzWuuE5PbUL2EmKQ5hX4JoT5+LcZX2YbGAWeqFcMKVt1PfSO89c1hEXUqkGSbngMQwBY5IZgJaeshlHtFlIkecdzXlmGC98QT7Yf1BmFroSH2QmxsG1Oc2egdkU0xPOpOAu8uEqhIVzq08ThbUJ/Hm0yktK9RPFCLNJSWPVAkmYxTQAr7PPbwA4JtqJiK4FcD2APIDV0fMAPgLglxFGcTcRDQN4CMDnVRoSoFQY5X6/pWwMJ7bk8e1LBjAwq7Q8TrWA/tGdPzg91H78vG78j6d/j/5JhQvpQkM0eNpAREZGoc//4BMrCjL1lgNeo0JaSCspWeiCVRNZCVb+Sw3XVQ+8eDKCZBHOwuwedzbnRCcNbXzm0dEceZYCXUpDwiHFVISN3nJq/HzWwb6hEWPt+Oj4ROHffIhZqEJmYbLR6KdIUklxrFAxbyil1O0AbieiCwDcBOBSfY6IDgfwRQCnsksuVEptI6I2uMziYgD3RMcloisBXAkAM2bUn9GzXJRq61iTUGJJA7Z8fm3Bzve8gT6sWTgZE1vyofZn/supqTLyjRaDsyfGd0oAXfipqzWP30fqcwPmmJ5yoPX5K+Z2BTt4dp7r8/VOOJ91AjXUcGGJVCDYVXc2B0yIn//SuUfiuvuf8l2Oo/AlC0PQHgdnUjmmVtPgUfQhhpVxmQVvkxgxr4JoSgiqmXo4ABChvprX6f+5FDGLJL/CbQD4NrDPazPhfgDn6A9E1AfgxwAuUUr9VrcrpbZ5/98HcB9cdVcBlFJ3KqUGlFIDPT2lBS7VElpIKvf7jYt0rmc0ZDMFxjoiKmAUADChMRfr1jgecfnxs/G1C5bgjEW9vnojbkErFyv7u3H/lcvxiVVzmGQh1+TQC3g+QywIkUsWhenbO5pzQWZbtiJO8BZwk42HSxYSE+MI57oK1FcaHU3cayk40yCWhi0cv8WzeewbGjYyi8BmIUsWekpHRoI09mGVVW25RZIlaROAfiKaTUR5AOsBbOQdiKiffTwTwEteeweAnwC4QSn1r6x/loi6veMcgLMAPDeaB0kbfG+oMr/fQ1i1b1EBNOezOOvIqWJdFKC0OIs4ENwsA9zTx7Qo6wU8l3H8aHqTzWKnJzF0MpsFFyKTZlPmkonZZuHZUlgaEs7kcgYPJUmqlRix9rDaOzQcul5SQ/FgQMnDaf/BYQx7DNZkS6kFYtVQSqmDRLQBridTBsBdSqnniegWAJuVUhsBbCCiNXDDR95FoILaAGAegJuJ6Gav7VQAuwE85jGKDIDHAXyrgs9V96hENLY2zlmMP5gyzJaDcG344ouyHyjH0n2YbBY7vVxoHc05Mc4iTjrStWLOXNTrexhq+0oUes3PZoKUJQTgb/90Mf73b3YYgwV5aVjpvE+Lt6jvPTAszhcQME2ex0xiiMNK+XMWkizqwMANpdSjAB6NtN3Mjq8zXPd5AJ83DLssIY3jEpXYRfzfG07G2x+MW8ezcY1MBW0WktNhmVUAABNpSURBVMHW5IsSVEpUss2C0bVrn1tnu70pSD+fJCGfxuzuFjx+/QmY092CTa++AwD4/Xt7xb48l1aGJVM7Z8k0nLNkGh7Y9Jp435zvcVWciWnX2+Z8NsIsgj56ylobmH2EdTjzyF785JntGB4JGEuDUN+8VrDpPqoEP+tsmQqlSugnp7Q3Ykq72TvH4tACf2cqqoYSFj8F4KvnLwml9gbCahu9KA8bJAvuHqp32JkSJAvHId+zTNs39hyQi25paSKbId/AzbP/mmwSerEOM8zC8RtzGdy67nCs7O/BH/kGjRu4mQebT5dg7xkZ4ZIFr29eB5KFRfko22ZhjRYWJSIU+1DiC/Sdjx2NWV1ynI6kglEKOPuoqQV9tWShFMQysmL6dpZGJBrjUAwSY4mmfw/GYpKFkDlXutUZi6bgnd0HCs6bJJ6LV8wCgJCrr2SzkApLAcAET5U2ohQ6mnPYuXconKa/DryhLMrAaCNGLLOwSIrRpvsAgBM/NMlYhU1SqyiDiVurbUaU8mkwSRaKLZ5+fjN2XjL+PvJnK0W6gjgLkawgfbxDvts2j8ngY2npZOmMTkMd8WSG9+hxUA1SPt/updkfVgozPcYd7lv0tlWHZRZVgp+vqczray1yWtQ3KuE660cls7Y4A7cvWQCY1tEEAOifHAQhcgagGUTGCTyQQrtuYVE21Z0IUqkYkjhqZsEM3No9NTrW7v2uLaWtMevTW4rhPRQ7IZwPSxZBu471GBlRvsGc1z6pCwO3xdij1rsIi/rE35x3FO7611cqsrBkiHBQKXGnbPaGCowaS2Z04sfXHIsj+zqK38dx/M1RXKwIDzaU1DlxEdy5TBAsyNVQkmTRmMuUVJ5WGkuSQnhQHs9ZpdVQw0r5BvP9B3kSxuL3rTasZFEl6OIx3ayITCmo9S7Cov6gFPCRZX34yZ8fX5GFRS7NWvyafCas4lkyo9O4E9djZVj8RuxCa8iVlPVVSzJdmslknCBY0GTfCBnehWDBuN9myA1XWGF1VUeXbmbg1p5kI8DUDtcxpdEauA99nH/0DLQ2uIFT5cCyCoukiKu/UC4OnzoBv3ztvYiB2/1vcp31S6kmGF8Pawpik5hMLuRtVdjXlP49MHDL8R9SPETGCWpy6LNdQpaBgnsZnkeDx1k4Bunoz0/uR297E+Z0t+CBzW5qvlrvHy2zqBIch7Bu8bT4jgbU+sWwqG9Uglnc/dFBPL99ZySKuDgziIvDkJBxgj1znEGX11gvxY6gz3M3Xa6yknI4ccZCBPzDtcf5dphiCEkWrL2jOYf39gyFkk1KbrTDIwoN2QwuWj4TT/7uHZHGWsAyi5TCqqEsRoNKBHC3N+dw7NzuUJt+LY22AUefT36fDEsEGHKdlSQLQxK+OGah4xUUZC8truLhLq688NPi6cVtLxJdnHHcc9kgXnl7dyhpoeQZxemqtxTlFhYWdQC+PldrYdGLqrHWdYzkIUHykAIM3lCMC4ZrTBR/Xm1DfG/PUMAs2EMcMyfIBhxIFrLNIg6mRIJH9nUUGPtDdpdM4dzlE9S+GCtYA7eFxSGIqjGLwNmp+H0TqKF811mS1VCyzUJ+rjjJYpLHLFbM6QqYBcuGyxmTbg3ZLEqYTodJSXHXZQT7BpfawinKrWRhYWFRYVTLzVIPa3SdZbaBpGOZ7BSSGsrEFOIki5aGLP7PX52ESRMa8MSLOwCEJYuMYAtx1VCF6czjwK8vpdyrFIUe9v4qgYgqwDILC4tDEFXbhfrDytxiUV87rjphLi5eMTPxkI5D/rhOjBrK9FxJghCnT2wGwAL4RmTJIkiXziWL5PPJ3YDjmEVWkKQ4I87XW9ZZCwuLdGDNYZPw7Lad4jlTqdNKIs5m4RDhhtMXJBtLL8pMDWXK2Bo/VvLOkuusZGiOekOVOr4rWRTvq6WnhmzgpRWyWaSoSqRlFhYWdYRvX3p0on5VU0PF2CzK2fyG4hJ09nAKq6GO7GvHM2/ITLL0+xXaBiRmwWtylBIQ56uhKL7cq2YQ3a0Nso1GqPddK1hmYWFxCKJ63lAuTHEUpUUZF/YNLdTsGR64cgXeNxQ20jhvWR9OXzQl9q563GGTGspbnxVUmQZub8wENUX0+J0tOZGxmAz6tYBlFhYWdQ5pIauWelsv5qYdc7n3JcYkAJeNcMmiKZ/x8yWZ8KXzjkp0LzGCW0hgOKIQirNICu7lFYdADZUJMvoqmYnVGolkHCJaS0RbiGgrEd0gnL+KiJ4loqeI6F+IaCE7d6N33RYiOi3pmBYWFqWBpw2vlmTR0ZzDJ1bNwX1XHCOeL+W2OnGeVIVuOXNxrTR0PIMpNxQxyaMcyUIv9knsKJqGXCZQeXGqqjUH5SBWsiCiDIDbAZwC4A0Am4hoo1LqBdbtPqXUHV7/swF8BcBaj2msB3A4gKkAHiei+d41cWNaWFiUierFWRBuPOMw8/kS9uDfvWwQ//jcm+hpa/CvyjqEf/zk8Zje2Vy1Z/AjpePyWynl7/xLea5hPwI8vu+QlyY9n82Iz1trDyiOJJLFIICtSqmXlVIHANwPYB3voJTaxT62IGCO6wDcr5Tar5R6BcBWb7zYMS0sLMpHJdJ9lINS1rbpE5txxao5oeuICAumTEBLQ7ZqqrS4qnobVs8DAPRPbgtcW0ugpcnLpbV8TldsX203yTlUteetFJLYLKYBeJ19fgNAgQxKRNcCuB5AHsBqdu2/Ra7V2fVix/TGvRLAlQAwY8aMBORaWIwv6EyoPCNqrfIIjfau/HqTCuaf/mIVtu/cV/Y9soLNguOkD03Cq18406PB5bqlzGdHcx6PfXIVZnY1x/Y9OBykQ6917qc4VMzArZS6HcDtRHQBgJsAXFqhce8EcCcADAwMjLJYaX3h7y8dwNye1viOFuMa5y2bjozj4JzFQTr8mjGLBPf9fzeu9hdJ/zoU2gZMxt3+yW3on9xWNo1Swj4ToinKk+JDU5LRp6v15bKHBrPYBmA6+9zntZlwP4BvJLi2lDHHJU4+bHKtSbCoAzgO4dxlfeG2Gq07Se7b225O883XSyndRyXQ2uAue32d8Tv/coLySoGmYcn0DuYNVZ17jRZJmMUmAP1ENBvugr4ewAW8AxH1K6Ve8j6eCUAfbwRwHxF9Ba6Bux/Av8Nl1EXHtLCwKB+1MoyWe1/fZjEGuVVndDXjzouXYfnceJtCtZnFspmdeOyTqzB/citefns3gLBXW5oQyyyUUgeJaAOAxwBkANyllHqeiG4BsFkptRHABiJaA2AIwLvwVFBevx8AeAHAQQDXKqWGAUAas/KPZ2ExPpEml8uSMEZkn3p4fPAegLIiuEsBIVBZHQpqKCilHgXwaKTtZnZ8XZFrbwNwW5IxLSwsKgPLKyqDcuIsksAhr0AUhdvSjPQkHrGwsKgY0r5LjUKrr9IUVwBUT0KTJJa0f2eWWVhYHIJI+bpjRNp21zrau9JMTDMJ/rwl1I2qCWxuKAuLQxC5WkXljRJjYeAuBbzqHcc9lw3GFlwqBh6EqJF2O5NlFhYWhyCq5XZaLWhq0yYRZf1KeWHCVs3vGdW4UoJCzZhSKlhYNZSFhUXtEbjOpgvVcp0NsvcGbWljlFFYycLCwiI9SNmCWW4EN8d9VxxTEIgoCX5pN3BbZmFhYVFzjGVQXinIZEYvWRw7t7ugTasJuTE77czCqqEsLCxSg7Stl0F+qsoSJqVJ96WNlBotrGRhYWFRc/iJBGtMRxTVC8rz0qQruVofxxf+wyK0NeYqS0AZsMzCwsKi5pBcSdOAcsqqJsHXL1yKb/x8K7paGvy2wBsqLFqsH0xHaQbLLCwsDlE8edMa3/WzXhDlFS35DAZmTawNMaheUN7g7IkYnD0Yaku7t7NlFhYWhyi6WhviO6UEJsvA87esHWtSQsj4cRbVhzVwW1hYWMSgKe+WIk3benlYbxsuXzkbg3OqL92k7dmjsJKFhYVFzXHlqjnYe2AYM7taak1KCA3ZDP76rIVjci9t5Le5oSwsLCwMWL1gMlYvGN+VIbXn1fkpMWhHYZmFhYWFRQrgOIQXb12LfCad1oFEVBHRWiLaQkRbiegG4fz1RPQCET1DRP9MRDO99pOI6Cn2t4+IzvHOfYeIXmHnFlf20SwsLCzqC425TGqTQMZKFkSUAXA7gFMAvAFgExFtVEq9wLr9CsCAUmoPEV0N4L8C+FOl1BMAFnvjTASwFcD/ZNd9Win1YGUexcLCwqJ8fPm8o/DbHR/UmozUIokaahDAVqXUywBARPcDWAe3rjYAwGMKGv8G4CJhnHMB/FQptad8ci0sLNKIH11zLLa8+X6tyRgVzl3WV2sSUo0kaqhpAF5nn9/w2ky4HMBPhfb1AL4fabvNU139NyKqH6dwCwuLEJbO6EytYdaiMqioJYWILgIwAOBLkfZeAIsAPMaabwSwAMDRACYC+IxhzCuJaDMRbd6xY0clybWwsLCwSIgkzGIbgOnsc5/XFgIRrQHwWQBnK6X2R07/RwA/VkoN6Qal1HblYj+Au+GquwqglLpTKTWglBro6RlddSoLCwsLi/KQhFlsAtBPRLOJKA9XnbSRdyCiJQC+CZdRvCWMcT4iKihP2gC5SVfOAfBc6eRbWFhYWIwFYg3cSqmDRLQBrgopA+AupdTzRHQLgM1KqY1w1U6tAH7oJdx6TSl1NgAQ0Sy4ksn/igx9LxH1wE278hSAqyryRBYWFhYWFQeptMaWCxgYGFCbN2+uNRkWFhYWdQUielIpNTCaMdIZKmhhYWFhkSpYZmFhYWFhEQvLLCwsLCwsYlFXNgsi2gHgd2Ve3g3g7QqSMxaoR5qB+qTb0jx2qEe6653mmUqpUcUe1BWzGA2IaPNoDTxjjXqkGahPui3NY4d6pNvSbNVQFhYWFhYJYJmFhYWFhUUsxhOzuLPWBJSBeqQZqE+6Lc1jh3qke9zTPG5sFhYWFhYW5WM8SRYWFhYWFmViXDCLuLKwtQIRTSeiJ7yStM8T0XVe+0Qi+iciesn73+m1ExF91XuOZ4hoaQ1pzxDRr4joEe/zbCL6hUfbA17SSRBRg/d5q3d+Vo3o7SCiB4noRSL6NRGtqJN5/gvv3XiOiL5PRI1pm2siuouI3iKi51hbyXNLRJd6/V8ioktrQPOXvPfjGSL6MRF1sHM3ejRvIaLTWPuYri0S3ezcXxKRIqJu73Nl51opdUj/wU1++FsAcwDkATwNYGGt6fJo6wWw1DtuA/AbAAvhlqW9wWu/AcAXveMz4BaWIgDLAfyihrRfD+A+AI94n38AYL13fAeAq73jawDc4R2vB/BAjej9LoCPe8d5AB1pn2e4RcZeAdDE5vijaZtrAKsALAXwHGsraW7h1rR52fvf6R13jjHNpwLIesdfZDQv9NaNBgCzvfUkU4u1RaLba58ON9nr7wB0V2Oux/wHMNZ/AFYAeIx9vhHAjbWmy0Drw3BrnW8B0Ou19QLY4h1/E8D5rL/fb4zp7APwzwBWA3jEexnfZj80f869F3iFd5z1+tEY09vuLboUaU/7POsqlRO9uXsEwGlpnGsAsyILb0lzC7eMwTdZe6jfWNAcOfdhAPd6x6E1Q89zrdYWiW4ADwI4CsCrCJhFRed6PKihSi0LWxN4KoMlAH4BYLJSart36k0Ak73jtDzL3wL4KwAj3ucuAO8ppQ4KdPk0e+d3ev3HErMB7ABwt6c6+zYRtSDl86yU2gbgywBeA7Ad7tw9iXTPtUapc5uKOWe4DEF56FTTTETrAGxTSj0dOVVRuscDs0g9iKgVwEMAPqmU2sXPKZf1p8ZljYjOAvCWUurJWtNSArJwRfdvKKWWANgNVzXiI23zDACenn8dXGY3FUALgLU1JaoMpHFui4GIPgvgIIB7a01LHIioGcB/AnBzte81HphForKwtQIR5eAyinuVUj/ymv9AQSXBXgC6+mAanuU4AGcT0asA7oerivo7AB1EpItpcbp8mr3z7QD+OJYEw905vaGU+oX3+UG4zCPN8wwAawC8opTaodySxD+CO/9pnmuNUuc2FXNORB8FcBaACz0mB6Sb5rlwNxNPe7/JPgC/JKIpRegri+7xwCxiy8LWCkREAP4ewK+VUl9hpzYC0B4Kl8K1Zej2Szwvh+UAdjJRf0yglLpRKdWnlJoFdy5/ppS6EMATAM410Kyf5Vyv/5juMpVSbwJ4nYg+5DWdDOAFpHiePbwGYDkRNXvviqY7tXPNUOrcPgbgVCLq9CSqU722MQMRrYWrXj1bKbWHndoIYL3nbTYbQD+Af0cK1hal1LNKqUlKqVneb/INuE4zb6LSc11tY0wa/uB6BfwGrufCZ2tND6NrJVzx/Bm4pWWf8mjtgmtAfgnA4wAmev0JwO3eczwLYKDG9J+IwBtqDtwf0FYAPwTQ4LU3ep+3eufn1IjWxQA2e3P9D3C9QFI/zwA+B+BFuDXqvwfXIydVcw3g+3BtKkPeYnV5OXML106w1fv7WA1o3gpXl69/i3ew/p/1aN4C4HTWPqZri0R35PyrCAzcFZ1rG8FtYWFhYRGL8aCGsrCwsLAYJSyzsLCwsLCIhWUWFhYWFhaxsMzCwsLCwiIWlllYWFhYWMTCMgsLCwsLi1hYZmFhYWFhEQvLLCwsLCwsYvH/Aebcu5Fl2WaWAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "zoifJoqnZfsF"
      },
      "source": [
        "final_result_for_1st_round[['id','pressure']].to_csv('submit_2021_02_XX.csv',index=False)"
      ],
      "execution_count": 49,
      "outputs": []
    }
  ]
}